2016-12-16 91 views
1
DBS

跟進問題sp execute code如何循環使用sp_executesql

我想通過存儲在光標DBS名稱列表循環,我不知道在整合USE命令是什麼在起作用到SP執行命令,因爲我需要該語句來對付不斷變化的數據庫。

我試過下面的代碼,但是sp_executesql在@dbfullname上返回語法錯誤。 (在瞭解了更多sp_executesql的定義之後,我在想沒有辦法添加這個USE命令,那麼該怎麼做呢?任何指針?它是否需要在批處理中完成?)

 declare @dbfullname varchar(60) 
     declare @name varchar(50) 
     DECLARE @userName1 varchar(20) 
     DECLARE @userexists bit 

     SET @userName1 = 'testUser' 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @dbfullname = N'MyDb' + @name 

     EXEC sp_executesql N'use @dbfullname; SET @userexists = CASE WHEN EXISTS(SELECT 1 
           FROM sys.database_principals 
           WHERE name = @userName1) 
           THEN 1 ELSE 0 
            END', 
          N'@userName1 varchar(20), @userExists bit output', 
          @userName1, 
          @userExists output 

    END 
+0

提示:使用合適的軟件(MySQL,Oracle,DB2,...)和版本(例如, '的SQL服務器2014'。語法和功能的差異往往會影響答案。 – HABO

回答

1

USE不接受變量或表達式,只接受靜態數據庫名稱。

您可以組裝之前EXEC的命令,例如:

set @dbfullname = N'MyDb' + @name; 
declare @SQL as NVarChar(1000) = N'use ' + @dbfullname + 
    N'; set @userExists = case when exists ...;'; 
exec SP_ExecuteSQL @SQL, @userName1, @userExists output; 

注意,如果在@dbfullname一個頑皮的值,這使你接觸到SQL注入攻擊的可能性。

+0

它是做一個批次更新的種類,所以完全控制數據 – user1161137

+0

試圖做你說的,但不讓我定義一個nvarchar出於某種原因。所以獲取錯誤過程期望類型'ntext/nchar/nvarchar'參數'@statement' – user1161137

+0

啊好吧..我初始化nvarchar太高...我做了nvarchar(6000),它不會工作.. didn不檢查上限。一旦我做到了這一點...解決了這個問題後,打破了聲明。 – user1161137

0

按照Habo ..他的解決方案解決了我的問題..我只是想發佈我改變的那些誰可能不會完全按照改變。注意必須使用nvarchar,因爲sp_executesql需要它。

 declare @nsql nvarchar(1000) 

     SET @nsql = N'use ' + @dbfullname + N'; SET @userexists = CASE WHEN EXISTS(SELECT 1 ' + 
           ' FROM sys.database_principals ' + 
           ' WHERE name = @userName1) ' + 
           ' THEN 1 ELSE 0 ' + 
           ' END' 

     EXEC sp_executesql @nsql, 
          N'@userName1 varchar(20), @userExists bit output', 
          @userName1, 
          @userExists output