【问题标题】:use sp_addrolemember with invoke-sqlcmd in powershell在 powershell 中使用 sp_addrolemember 和 invoke-sqlcmd
【发布时间】:2015-09-16 08:55:03
【问题描述】:

我有一个非常简单的 PowerShell 脚本,它将 sql server 登录添加到 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' 传递到查询文本中时,它不喜欢 \,但我将相同的字符串硬编码到它工作的查询文本中

【问题讨论】:

    标签: sql sql-server-2008 powershell


    【解决方案1】:

    我认为问题在于您的原始脚本在最终的 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
    

    【讨论】:

      【解决方案2】:

      问题是查询中有 Powershell 代码,这些代码将作为 SQL 代码交付和执行。

      将 2 个 Powershell 赋值语句移到 SQL 查询“外部”,如下所示:

      $login = 'net1\vintida'     
      $DBrole = 'db_owner'               
      
      $Q3 = " exec sp_addrolemember @rolename = $DBRole,
                                    @membername = $login "
      
      Invoke-Sqlcmd -Query $Q3
      

      【讨论】:

      • 现在这样做了,错误仍然只抱怨反斜杠 '\' 附近的语法不正确 如果我对 $login 进行硬编码,它可以工作
      • 我修改了原始问题以包含您的观察
      猜你喜欢
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2014-04-15
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多