Tsql 如何使用sp_executesql循环dbs

Tsql 如何使用sp_executesql循环dbs,tsql,stored-procedures,Tsql,Stored Procedures,后续问题 我想循环浏览存储在游标中的dbs名称列表,我不知道将USE命令集成到sp execute命令中的方法是什么,因为我需要该语句来应对dbs的更改 我尝试了下面的代码,但sp_executesql在@dbfullname上返回了一个语法错误。(在进一步了解了sp_executesql的定义之后,我认为没有办法添加USE命令。那么还可以怎么做?有指针吗?需要在批处理事务中完成吗?) 不接受变量或表达式,仅接受静态数据库名称 您可以在执行EXEC之前组合该命令,例如: set @dbfulln

后续问题

我想循环浏览存储在游标中的dbs名称列表,我不知道将USE命令集成到sp execute命令中的方法是什么,因为我需要该语句来应对dbs的更改

我尝试了下面的代码,但sp_executesql在@dbfullname上返回了一个语法错误。(在进一步了解了sp_executesql的定义之后,我认为没有办法添加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注入攻击。

根据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

提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和功能上的差异通常会影响答案。这是一个批量更新排序,所以完全控制数据尝试按照你说的做,但出于某种原因不让我定义nvarchar。因此,获取错误过程需要类型为“ntext/nchar/nvarchar”的参数“@statement”。。我初始化的nvarchar太高。。。我做过nvarchar(6000),但它不起作用。。没有检查上限。一旦我这么做了。。。这解决了分解语句后的问题。@user1161137抱歉,我在添加示例代码时有点太慢了。很高兴它对你有用。
        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