2012-05-28 70 views
1

我已經寫了一個存儲過程,其中表名和數據庫名使用來自不同兩個表的遊標收集 。
但我的問題是,當我運行一個查詢來找出一個表中存在的數據庫或沒有,然後顯示一個錯誤。 現在我該如何運行查詢和存儲輸出到一個變量?如何從sys.tables中獲取表名並將輸出存儲在變量中?

Declare @table_exist nvarchar(200),@val1 nvarchar(200),@return1 nvarchar(200); 
    SET @table_exist= 
    'SELECT 1 FROM '[email protected]_name+'.sys.tables 
    where name='[email protected]_name+''; 
    EXEC sp_executesql @table_exist,@return1 OUTPUT; 
    select @return1; 

錯誤:

Invalid column name 'table name' 
+0

看起來非常髒編寫的代碼。 – Sajmon

+0

然後請改進它(如我已經完成)或寫一個答案 –

回答

2

您構建動態查詢時,應該使用quotename

SET @table_exist= 
    'SELECT 1 FROM '+ quotename(@db_name)+'.sys.tables 
    where name='+quotename(@table_name)+''; 

當面臨這樣的錯誤最好將print @table_exists,看看什麼是真正建立。

我還沒有正確地查看您的查詢。你缺少撇號:

SET @table_exist= 
    'SELECT 1 FROM '+ quotename(@db_name)+'.sys.tables 
    where name=''' + @table_name +''''; 

UPDATE:

當使用輸出變量,你應該把它設置在一個查詢:

SET @table_exist= 
    'SELECT @return1 = 1 FROM ' + quotename(@db_name) + '.sys.tables 
    where name='''[email protected]_name+''''; 

爲了防止結果返回到客戶端設置,創建臨時表並向其中插入結果集。在這種情況下,將只留下一個結果集的select @return1結果:

declare @tbl table (exist bit) 
    insert into @tbl 
    EXEC sp_executesql @table_exist, N'@return1 nvarchar(200) out', @return1 OUT; 
    select @return1; 
+0

當我打印@table_exist然後顯示:SELECT 1 FROM [db_name] .sys.tables where name = [table name]。出於這個原因,我再次得到相同的錯誤。 - 無效的列名「表名」.pls幫助 – riad

+0

@riad我糾正了我的錯誤答案。 –

+0

謝謝,它的作品。但是這行EXEC sp_executesql @ table_exist,@ return1 OUTPUT產生巨大的消息並顯示錯誤「查詢已經超出了可以在結果網格中顯示的結果集的最大數量」。我如何防止顯示該消息。請幫助。 – riad

1

最好是通過使用'"正確編寫查詢。在編寫查詢時,這會減少錯誤。

您代碼中的錯誤是您僅使用'而感到困惑。最好只用於變量'

編寫代碼爲:

"SELECT 1 FROM ' "[email protected]_name+" '.sys.tables 
    where name=' "[email protected]_name+" ' "; 
相關問題