繁体   English   中英

在Powershell中将sp_addrolemember与invoke-sqlcmd一起使用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM