tài sản @tblName
của bạn tồn tại ở phạm vi bên ngoài - phạm vi của dòng mã "bình thường" của mình - nhưng không phải ở phạm vi bên trong của SQL bạn đang xây dựng trong chuỗi có ....
Bạn cần để thay đổi các dòng của bạn để đọc:
SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')'
và sau đó nó sẽ hoạt động tốt. Ngoài ra, bạn không đề cập đến phiên bản SQL Server của bạn - nhưng kể từ SQL Server 2005 trở lên, bạn nên ngừng sử dụng sysobjects
và sysindexes
- thay vào đó, hãy sử dụng lược đồ sys
mới có chứa nhiều thông tin hơn - nhưng dễ dàng hơn. Thay đổi truy vấn của bạn để:
SET @tblName ='SELECT DISTINCT t.name as TableName
FROM sys.tables t
INNER JOIN sys.indexes i on i.object_id = t.object_id
WHERE t.name LIKE ''%empty%'''
Xem MSDN: Querying the SQL Server System Catalog cho rất nhiều thông tin về những gì có sẵn trong sys
schema mới và làm thế nào để tận dụng tối đa của nó!
Khi "rsbarro" được chỉ ra: đặt câu lệnh SQL này vào dấu ngoặc kép là lẻ - bạn có đang thực hiện câu lệnh này bằng cách sử dụng EXEC(...)
không? Nhưng sau đó làm thế nào để bạn gán giá trị trở lại tài sản @tblName
? Không thực sự có ý nghĩa .....
Nếu bạn muốn thực sự chạy truy vấn này để có được một giá trị, bạn nên có một cái gì đó như thế này:
SELECT TOP 1 @tblName = t.name
FROM sys.tables t
INNER JOIN sys.indexes i on i.object_id = t.object_id
WHERE t.name LIKE '%empty%'
Bạn cần có một TOP 1
trong đó được chắc chắn để chỉ nhận được một giá trị duy nhất - nếu không câu lệnh này có thể không thành công (nếu có nhiều hàng được chọn).
Nguồn
2012-02-23 05:48:56
Tôi hy vọng chỉ có hai cột trong bất kỳ bảng nào được trả lại và kiểu dữ liệu phù hợp ... –
@OMGPonies: Tất nhiên, bạn có nghĩa là cột có thể chèn. –