2014-09-01 44 views
0

我無法執行存儲過程。它拋出一個錯誤執行存儲過程期間無效的列名錯誤

無效的列名稱DW201401「

命令來執行存儲過程:

exec RM_UTIL_MODE server,'DW201401' 

存儲過程的代碼:

ALTER Procedure [dbo].[RM_UTIL_MODE] 
    @ServerName varchar(50), 
    @Value varchar(50) 
As 
Begin 
    declare @query nvarchar(max) 

    set @query = N'SELECT mode FROM ' + @ServerName + 
       N'.master.dbo.sysdatabases WHERE name =' + @Value 

    exec sp_executesql @query 
End 

但當我試圖單獨運行查詢時,它會給出結果。

select mode, name 
from server.master.dbo.sysdatabases 
where name = 'DW201401' 

回答

4

據推測,這個問題是引號@Value

declare @query nvarchar(max) 
set @query = N'SELECT mode FROM ' 
+ @ServerName 
+ N'.master.dbo.sysdatabases 
WHERE name = '''[email protected]+''''; 

不過,我會用參數替換,而不是:

declare @query nvarchar(max) ; 

set @query = N'SELECT mode 
FROM ' + @ServerName + N'.master.dbo.sysdatabases 
WHERE name = @value'; 

exec sp_executesql @query, N'@value varchar(50)', @value = @value; 

你是已經使用sp_executesql,所以你不妨正確使用它。注意:您不能替換服務器名稱。

編輯:

要闡述的意見,我會這樣寫代碼:

declare @sql nvarchar(max) ; 

    set @sql = N' 
SELECT mode 
FROM @ServerName.master.dbo.sysdatabases 
WHERE name = @value'; 

    set @sql = replace(@sql, '@ServerName', quotename(@ServerName)); 

    exec sp_executesql @sql, N'@value varchar(50)', @value = @value; 

當使用動態SQL,我不再拼湊使用字符串連接的查詢。相反,我把持有人並使用replace()。我發現拼接很難維護,並且經常掩蓋了SQL正在做什麼。儘管在使用replace()時有更多的開銷(我經常多次使用它),但它對於防止錯誤和維護代碼是值得的(另外,我的查詢往往會運行一段時間,所以開銷比較少到查詢時間)。

+2

我也會寫'QUOTENAME(@ServerName)'而不是'@ ServerName' – 2014-09-01 14:25:16

+0

你能告訴我如何在傳遞多個參數的情況下使用下面的exec行。而不是價值,我需要通過value1,value2,value3 ... – user3859666 2014-09-02 05:52:20

0

你選擇的樣子:

select mode, name from server.master.dbo.sysdatabases where name = DW201401 

,所以你需要添加在你的動態查詢轉義引號:

exec RM_UTIL_MODE cefmtqcfindv3,'DW201401' 

ALTER Procedure [dbo].[RM_UTIL_MODE] 
@ServerName varchar(50),@Value varchar(50) 
As 

Begin 

declare @query nvarchar(max) 
set @query = N'SELECT mode FROM ' 
+ @ServerName 
+ N'.master.dbo.sysdatabases 
WHERE name ='''[email protected]+'''' 

exec sp_executesql @query 

End 

正如一個建議,當你構建一個動態SQL ,請嘗試使用PRINT而不是EXEC,然後獲取打印內容並嘗試。大多數時候你會知道哪裏出了問題。

只是作爲一個例子:

ALTER Procedure [dbo].[RM_UTIL_MODE] 
@ServerName varchar(50),@Value varchar(50) 
As 

Begin 

declare @query nvarchar(max) 
set @query = N'SELECT mode FROM ' 
+ @ServerName 
+ N'.master.dbo.sysdatabases 
WHERE name ='''[email protected]+'''' 

PRINT @query 

--exec sp_executesql @query 

End 
+0

謝謝......你能告訴我如何使用打印? – user3859666 2014-09-01 14:36:03

+0

@ user3859666檢查編輯。 – 2014-09-01 14:37:34