如何使用Invoke-Sqlcmd在Powershell脚本中使用表值参数(TVP)调用sp_executeSql?

时间:2016-10-22 15:00:20

标签: tsql powershell

所以,我知道如何用C#代码用TVP调用sp_executeSql。这意味着我可以在Powershell中使用ADO.Net进行此操作。

但我很好奇如何使用Invoke-Sqlcmd命令执行此操作?问题是TVP值是由用户给出的,我想避免任何Sql Injection的可能性。

我目前有以下代码:

$ControlSql = @"
SELECT ClientId,Namespace,DatabaseConnectionString
FROM Namespace n
JOIN DatabaseConnection dc ON n.DatabaseConnectionId = dc.DatabaseConnectionId
WHERE Namespace IN (SELECT Value FROM @Namespaces)
"@
$ControlParams = "'@Namespaces dbo.TableOfString READONLY'"
$ControlQuery = "EXECUTE sp_executesql @stmt = $ControlSql, @params = $ControlParams, @Namespaces = $Namespaces;"

@Namespaces = $Namespaces部分当然是错误的。 $Namespaces是用户提供的值列表。我不知道如何填充@Namespaces TVP。

我做到了,但我想知道这是不是正确的方法。我可以为INSERT INTO @Namespaces ...中的每个值生成单独的$Namespaces语句,然后将后者传递给最终的SELECT查询。

因此,如果$Namespaces包含1,000个条目,则生成的sql将包含1,000个参数。

这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

您可以传递包含值的逗号分隔的CSV文件,并使用批量插入来填充表值参数(TVP) Sql代码是:

 BULK INSERT @Namespaces 
 FROM 'path_to_Namespaces.txt'  
  WITH   
  (  
     FIELDTERMINATOR =' ,',  
     ROWTERMINATOR =' \n'  
  );  

修改你的代码以传递文件名(传递TVP的内容) 这样,您就可以避免传递大量参数。