Hiển thị kết quả từ 1 đến 7 / 7
  1. #1
    Tham gia
    03-09-2009
    Bài viết
    59
    Like
    0
    Thanked 0 Times in 0 Posts

    Truy vấn Table thông qua biến

    Cho mình hỏi cái này.
    Trong SQL2005 mình tạo ra 1 biến, rồi gán giá trị của biến là tên của Table nào đó. Sau đó sử dụng câu lệnh truy vấn Table thông qua biến này được không ?

    Ví dụ: Mình làm như sau:

    DECLARE @TableName varchar(20)
    SET @TableName = 'Table_1'
    SELECT * FROM @TableName

    Ý tưởng là vậy nhưng làm như trên thì nó không hiểu.

    Có ai biết làm cái này không?
    Quote Quote

  2. #2
    Tham gia
    23-09-2008
    Bài viết
    64
    Like
    0
    Thanked 0 Times in 0 Posts
    Hình như không được , vì nếu mình khai báo varchar() thì khi vào truy vấn nó sẽ tự động hiểu là 'tên bảng', mình cũng chưa làm thế này bao giờ.
    Tốt nhất nếu muốn làm vậy thì làm combobox ở trong ứng dụng cho người ta lựa chọn. Rồi cộng chuỗi sẽ có câu truy vấn, khi đó chỉ execute truy vấn đó thôi.

  3. #3
    Tham gia
    01-01-2008
    Location
    Thiên đường hạnh phúc
    Bài viết
    1,299
    Like
    9
    Thanked 127 Times in 67 Posts
    Bạn xem thử:
    Code:
    DECLARE @TableName varchar(20)
    SET @TableName = 'Table_1'
    EXEC('SELECT * FROM '+@TableName )

  4. #4
    Tham gia
    20-02-2009
    Location
    Ninh Bình
    Bài viết
    567
    Like
    0
    Thanked 34 Times in 31 Posts
    Quote Được gửi bởi Mr_Bac View Post
    Cho mình hỏi cái này.
    Trong SQL2005 mình tạo ra 1 biến, rồi gán giá trị của biến là tên của Table nào đó. Sau đó sử dụng câu lệnh truy vấn Table thông qua biến này được không ?

    Ví dụ: Mình làm như sau:

    DECLARE @TableName varchar(20)
    SET @TableName = 'Table_1'
    SELECT * FROM @TableName

    Ý tưởng là vậy nhưng làm như trên thì nó không hiểu.

    Có ai biết làm cái này không?

    Nếu muốn dùng biến cho một bảng, thì nguyên câu lệnh SQL phải nằm trong một biến. Thí dụ như:

    DECLARE @sqlCmd NVARCHAR(MAX)

    DECLARE @TableName varchar(20)
    SET @TableName = 'Table_1'

    SET @sqCmd = 'SELECT * FROM ' + @TableName

    EXEC IMMEDIATE @sqlCmd

    Còn như bạn BachNga đã hướng dẫn, thì lại là khác. Đó là dùng bảng nhớ (memory table), chứ không phải là cách dùng biến từ cho một bảng thường.

  5. #5
    Tham gia
    08-01-2010
    Location
    Washington, DC
    Bài viết
    168
    Like
    2
    Thanked 16 Times in 16 Posts
    Quote Được gửi bởi dq_ninh View Post
    Nếu muốn dùng biến cho một bảng, thì nguyên câu lệnh SQL phải nằm trong một biến. Thí dụ như:

    DECLARE @sqlCmd NVARCHAR(MAX)

    DECLARE @TableName varchar(20)
    SET @TableName = 'Table_1'

    SET @sqCmd = 'SELECT * FROM ' + @TableName

    EXEC IMMEDIATE @sqlCmd

    Còn như bạn BachNga đã hướng dẫn, thì lại là khác. Đó là dùng bảng nhớ (memory table), chứ không phải là cách dùng biến từ cho một bảng thường.
    1. Dùng biến cho 1 bảng không cần đưa toàn bộ câu lệnh vào 1 biến. Dùng như của bachnga là chính xác
    2. EXEC IMMEDIATE không phải là cú pháp T-SQL mà của Embedded SQL for C hoặc ở đâu đó (Oracle?)
    3. Dùng như của bachnga chính là sql động để đưa tên bảng vào câu lệnh. Còn dùng biến kiểu bảng thì khỏi cần sql động mà là thế này:
    DECLARE @t TABLE(i INT)
    -- insert dữ liệu vào @t
    ...
    SELECT * FROM @t

  6. #6
    Tham gia
    23-06-2006
    Bài viết
    204
    Like
    0
    Thanked 3 Times in 2 Posts
    Cách làm như bạn BachNga là đúng nhưng có thể sẽ là nguồn gốc của lỗi SQL Injection. Tóm lại ko nên làm như thế.

  7. #7
    Tham gia
    08-01-2010
    Location
    Washington, DC
    Bài viết
    168
    Like
    2
    Thanked 16 Times in 16 Posts
    thực ra nếu muốn dùng tên bảng trong biến thì buộc phải dùng sql động. Một cách khắc phục sql injection là dùng hàm quotename để thêm vào ký tự '[' và ']' ở đầu và cuối; đồng thời tránh lỗi khi tên bảng chứa các ký tự không phải chữ cái và số:
    SET @TableName = QUOTENAME('Table_1')

    Ví dụ nếu tên bảng chứa dấu cách thì cần phải dùng hàm quotename nếu không sẽ bị lỗi

Bookmarks

Quy định

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