[英]use sp_addrolemember with invoke-sqlcmd in powershell
我有一个非常简单的PowerShell脚本,该脚本将sql服务器登录名添加到db角色。 由于我将其用于SQL 2008,因此需要使用sp_addrolemember
存储过程。
如果我在管理工作室中使用t-sql像这样:
declare @dbrole varchar(100)
set @dbrole = 'db_owner'
declare @login varchar(100)
set @login = 'net1\vintida'
exec sp_addrolemember @rolename = @DBRole,
@membername = @login
那就没问题了
如果我使用这样的PowerShell脚本
$login = 'net1\vintida'
$DBrole = 'db_owner'
$Q3 = " exec sp_addrolemember @rolename = $DBRole,
@membername = $login "
Invoke-Sqlcmd -Query $Q3
然后会引发以下错误:
Invoke-Sqlcmd:'vintida'附近的语法不正确。 '\\'附近的语法不正确。
但是,如果我使用这样的powershell脚本
$DBrole = 'db_owner'
$Q3 = "exec sp_addrolemember @rolename = $DBRole,
@membername = 'net1\vintida' "
Invoke-Sqlcmd -Query $Q3
完美运作
我不明白为什么当我使用变量$login
将字符串'net1 \\ vintida'传递到查询文本时,它不喜欢\\,但是我将相同的字符串硬编码到查询文本中却有效
问题是查询中有Powershell代码,这些代码将作为SQL代码交付和执行。
将2个Powershell赋值语句移到SQL查询外部,如下所示:
$login = 'net1\vintida'
$DBrole = 'db_owner'
$Q3 = " exec sp_addrolemember @rolename = $DBRole,
@membername = $login "
Invoke-Sqlcmd -Query $Q3
我认为问题在于您的原始脚本在最终的T-SQL脚本中不包含单引号。
尝试这个:
$login = "'net1\vintida'"
$DBrole = "'db_owner'"
$Q3 = "exec sp_addrolemember @rolename = $DBRole, @membername = $login"
Invoke-Sqlcmd -Query $Q3
或者,或者:
$login = 'net1\vintida'
$DBrole = 'db_owner'
$Q3 = "exec sp_addrolemember @rolename = '$DBRole', @membername = '$login'"
Invoke-Sqlcmd -Query $Q3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.