使用SSMS外部的变量更改SQL Server数据库上下文

时间:2018-03-19 04:57:33

标签: sql sql-server

我遇到以下情况:我有一个安装程序,它在服务器上安装Web门户,并使用批处理文件调用.sql文件来设置SQL Server。到目前为止,非常好。

在该SQL文件中,除其他外,我还以文化无差异的方式向系统帐户授予权限。我在很大程度上依赖于变量,这导致了问题。

到目前为止,我找到了一个有效的解决方案。然而,它并没有让我感到非常优雅,因为它包括前期"'使用' + @database_creation_string"在所有EXEC声明面前。此脚本的完整相关上下文目前看起来像这样:

DECLARE @database_name NVARCHAR(MAX)
DECLARE @database_name_string NVARCHAR(MAX)

DECLARE @user_name_nt_authority_system NVARCHAR(MAX)
DECLARE @user_name_nt_authority_system_string NVARCHAR(MAX)

SET @database_name = 'fdbn'
SET @database_name_string = QUOTENAME(@database_name)

SET @user_name_nt_authority_system = SUSER_SNAME(0x010100000000000512000000)
SET @user_name_nt_authority_system_string = QUOTENAME(@user_name_nt_authority_system)

EXEC('USE ' + @database_name_string + 'CREATE USER' + @user_name_nt_authority_system_string + 'FOR LOGIN' + @user_name_nt_authority_system_string)
EXEC('USE ' + @database_name_string + 'ALTER ROLE [db_owner] ADD MEMBER' + @user_name_nt_authority_system_string)

如上所述,这有效,但我觉得必须有一种方法来实际更改数据库上下文,所以所有这些都是不可能的。

现在我明白以下内容并不起作用,因为EXEC()语句中发生的所有导航都会在该语句之外被忽略。

EXEC('USE' + @database_name_string)

我无法使用sqlcmd模式,因为我使用.bat文件调用脚本。

有更复杂的方法吗?或者在每个'USE' + @database_name_string语句前面加EXEC真的是唯一的方法吗?

1 个答案:

答案 0 :(得分:0)

另一种方法是在预先挂起相应的DB名称后使用sp_executesql。样本将是: Test.dbo.sp_executesql N' CREATE USER test_user FOR LOGIN [testlogin] WITH DEFAULT_SCHEMA = [dbo]';

图例:测试是数据库名称

在动态替换所需值之后,可以在EXEC内部使用上述语句。