Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Lấy tên cột, kiểu dữ liệu, khóa chính bằng truy vấn SQL????

  1. #1
    Ngày gia nhập
    05 2011
    Bài viết
    31

    Mặc định Lấy tên cột, kiểu dữ liệu, khóa chính bằng truy vấn SQL????

    Mình muốn lấy tên cột, kiểu dữ liệu, khóa chính bằng cách dùng lệnh truy vấn thì làm cách nào?
    Mình dùng lệnh select * from INFORMATION_SCHEMA.COLUMNS thì chỉ ra tên cột và kiểu dữ liệu.
    Còn dùng lệnh Select * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE thì chỉ ra khóa chính.

  2. #2
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Để lấy thông tin các columns trong 1 table thì đơn giản bạn dùng proc sp_columns của SqlServer.
    SQL Code:
    1. USE AdventureWorks
    2. EXEC sp_columns 'Product'

    Hoặc
    SQL Code:
    1. SELECT  c.name 'Column Name' ,
    2.         t.Name 'Data type' ,
    3.         c.max_length 'Max Length' ,
    4.         c.PRECISION ,
    5.         c.scale ,
    6.         c.is_nullable ,
    7.         ISNULL(i.is_primary_key, 0) 'Primary Key'
    8. FROM    sys.COLUMNS c
    9.         INNER JOIN sys.types t ON c.system_type_id = t.system_type_id
    10.         LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id
    11.                                                 AND ic.column_id = c.column_id
    12.         LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id
    13.                                          AND ic.index_id = i.index_id
    14. WHERE   c.object_id = OBJECT_ID('Production.Product')

    Nếu muốn lấy thông tin của primarykey thì thêm cái điều kiện :
    SQL Code:
    1. SELECT  c.name 'Column Name' ,
    2.         t.Name 'Data type' ,
    3.         c.max_length 'Max Length' ,
    4.         c.PRECISION ,
    5.         c.scale ,
    6.         c.is_nullable ,
    7.         ISNULL(i.is_primary_key, 0) 'Primary Key'
    8. FROM    sys.COLUMNS c
    9.         INNER JOIN sys.types t ON c.system_type_id = t.system_type_id
    10.         LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id
    11.                                                 AND ic.column_id = c.column_id
    12.         LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id
    13.                                          AND ic.index_id = i.index_id
    14. WHERE   c.object_id = OBJECT_ID('Production.Product')
    15.     AND i.is_primary_key=1
    Cánh Chym ứ mỏi

  3. #3
    Ngày gia nhập
    05 2011
    Bài viết
    31

    Ôi vui quá. Đang định tắt máy đi ngủ mà lại thấy có câu trả lời rồi nên không ngủ nữa. Cảm ơn bạn nhiều nhe. Nhưng mình phát sinh thế này (mình dùng đoạn code thứ 2 của bạn):
    1-- Khi dùng select * from INFORMATION_SCHEMA.COLUMNS thì cái chỗ độ lớn của kiểu dữ liệu ra chính xác như của mình tạo ra. Nhưng dùng sys.columns thì nó ra gấp đôi. (vd int của mình là null, nó ra là 4, nvarchar của mình là 30 nó ra 60). ==> mình muốn nó chính xác như của mình tạo í. là null và 30 thôi. hjhj
    2-- Lúc select ra kết quả thì phát sinh thêm vài cột y như lúc mình tạo, nhưng có kiểu dữ liệu là sysname ==> chỗ này mình giải quyết được rồi. hjhj. (lọc thêm điều kiện <>'sysname' là xong)
    3-- Mình tự viết truy vấn bằng cách lấy trong INFORMATION_SCHEMA như sau:
    Code:
    select distinct 
    		c.column_name,
    		c.data_type,
    		c.character_maximum_length,
    		cu.column_name
    from	INFORMATION_SCHEMA.COLUMNS c
    		left join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu 
    		on c.column_name=cu.column_name
    where c.table_name='Product'
    thì ra kết quả nhưng nó lại bị sắp xếp theo ABC vì có từ Distinct.==> minh muốn nó như lúc ban đâu chưa sắp xếp thì làm thế nào.
    ==> Nói chung ý mình là muốn ra kết quả y như lúc mình tạo cơ sở dữ liệu í. hjhj

  4. #4
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Trích dẫn Nguyên bản được gửi bởi dl_kidder Xem bài viết
    Ôi vui quá. Đang định tắt máy đi ngủ mà lại thấy có câu trả lời rồi nên không ngủ nữa. Cảm ơn bạn nhiều nhe. Nhưng mình phát sinh thế này (mình dùng đoạn code thứ 2 của bạn):
    1-- Khi dùng select * from INFORMATION_SCHEMA.COLUMNS thì cái chỗ độ lớn của kiểu dữ liệu ra chính xác như của mình tạo ra. Nhưng dùng sys.columns thì nó ra gấp đôi. (vd int của mình là null, nó ra là 4, nvarchar của mình là 30 nó ra 60). ==> mình muốn nó chính xác như của mình tạo í. là null và 30 thôi. hjhj
    Các kiểu dữ liệu unicode sẽ hiển thị chiều dài gấp đôi lên, trường max_length hiển thị vùng nhớ (byte count : số lượng byte chứa lưu trữ của column)
    Các trường kiểu numeric bạn nên sử dụng xprec, xscale trong table syscolumns, hoặc precision, scale trong table sys.columns. Lưu ý :
    Code:
    xprec ,precission = length of datatype
    xscale, scale = number of decimal digits
    Cánh Chym ứ mỏi

  5. #5
    Ngày gia nhập
    05 2011
    Bài viết
    31

    ^^. Cảm ơn bạn nhiều. Mình phải thử lại thêm vài phát nữa đã. hjhj

Các đề tài tương tự

  1. Cách truy xuất Control thông qua Tên?
    Gửi bởi thansaudh trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 06-08-2013, 02:32 PM
  2. Lấy thư viện từ khóa truy vấn của SQL bằng cách nào?
    Gửi bởi khanhduy.8hpm trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 27-05-2012, 08:52 AM
  3. MS SQL với C# truy xuất 2 khóa ngoại tới cùng 1 bảng
    Gửi bởi luxubu trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 2
    Bài viết cuối: 21-03-2012, 01:47 PM
  4. Trả lời: 1
    Bài viết cuối: 20-11-2011, 10:47 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn