2012-02-23 44 views
5

bất cứ ai có thể kiểm tra trên tuyên bố của tôi ...Khai báo các biến SQL - SQL Server

DECLARE @tblName varchar(MAX), 
     @strSQL varchar(MAX) 

SET @tblName ='SELECT DISTINCT o.name as TableName 
       FROM sysobjects o 
       JOIN sysindexes x on o.id = x.id 
       WHERE o.name LIKE ''%empty%''' 

SET @strSQL = 'INSERT INTO @tblName VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

lỗi của tôi là ...

Msg 1087, Level 15, State 2, Line 1
Phải khai báo biến bảng "@tblName".

Những gì tôi muốn làm là lấy tên bảng trên biến @tblName và chèn một số dữ liệu trong @strSQL biến

Ví dụ ... kết quả trong @tblNameCustomerInfo

sau đó trong @strSQL tôi sẽ sử dụng kết quả trong @tblName làm tên bảng của tôi trong Lệnh Chèn của tôi.

Vì vậy, biến số @strSQL sẽ là;

INSERT INTO CustomerInfo VALUES(......) 
+1

có thể trùng lặp của [SQL Declare Variables] (http://stackoverflow.com/questions/9407703/sql-declare-variables) –

Trả lời

2

Hãy thử điều này từ câu trả lời của tôi cho câu hỏi khác của bạn:

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%' 

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

Bạn đang vẫn không nhắc đến phiên bản SQL Server bạn đang sử dụng. Nhưng kể từ SQL Server 2005 trở lên, bạn nên ngừng sử dụng sysobjectssysindexes - 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.

Xem [MSDN: Truy vấn Danh mục hệ thống máy chủ SQL] [1] để biết thêm thông tin về những gì có sẵn trong lược đồ sys mới và cách tận dụng tối đa nó!

+0

oops, xấu của tôi, tôi đang sử dụng SQL Server 2008, nway..thanks 4 d giúp –

+0

một điều nữa ... nếu tôi định sử dụng câu lệnh IF trong @strSQL trước lệnh chèn vì tôi muốn xác minh trước nếu các giá trị mà tôi sẽ chèn vào không tồn tại trong bảng. xin lỗi vì nhiều câu hỏi ... coz Tôi chỉ mới bắt đầu nghiên cứu sql. –

2

Khi bạn khai báo nhiều hơn một biến với một tuyên bố đơn DECLARE, you only put the type once (ở cuối):

DECLARE @tblName, @strSQL varchar(MAX) 
+0

Tôi có thể đã thề câu hỏi ban đầu là về MySql (đó là những gì tôi trả lời). Có vẻ như Sql Server cho phép định nghĩa kiểu trùng lặp trong câu lệnh DECLARE – colithium

+0

Câu trả lời này không chính xác. SQL Server KHÔNG cho phép 'DECLARE @tblName, @strSQL varchar (MAX)'. Một * * phải chỉ định loại của mỗi biến như: 'declare @i int, @t varchar (max);' –

1

này nên được một cái gì đó thực sự có thể chạy:

DECLARE @tblName varchar(MAX), 
     @strSQL varchar(MAX) 

SET @tblName = (SELECT DISTINCT TOP 1 o.name as TableName 
       FROM sysobjects o 
       JOIN sysindexes x on o.id = x.id 
       WHERE o.name LIKE '%empty%') 

SET @strSQL = 'INSERT INTO ' + @tblName + ' VALUES(''trylng'', ''1'')' 
EXEC (@strSQL) 

Bất cứ điều gì trong báo giá có nghĩa là đó là một chuỗi và không mong đợi máy chủ sql chạy nó như tuyên bố, cùng một điều để biến trong một chuỗi, bạn không thể báo giá nó

+0

'DSINTINCT' ** và **' TOP 1' hơi quá nhiều ..... nếu bạn chỉ có 1 kết quả, nó không thể có bản sao anyway ..... –

+0

Chỉ muốn chắc chắn rằng nó sẽ không sụp đổ vì có thể có một số bảng khác nhau có tên tương tự –

Các vấn đề liên quan