如何解决使用具有表值参数的存储过程,使用PowerShell填充时态SQL DB表
尽管我熟悉Powershell,但我正在学习sql。
我试图使用表值参数调用存储过程,以将PowerShell中的数据数组插入到临时sql DB表中。
我正在使用sqlServer PowerShell模块:https://docs.microsoft.com/en-us/sql/powershell/download-sql-server-ps-module?view=sql-server-ver15
该数据库称为“ WAGS”,该表称为“ AzureADUsers”,而我的用户定义类型称为“ AzureADUser”
该命令似乎已成功完成,尽管我在表中没有看到任何数据,我不确定自己做错了什么,或者这是正确的方法。
我的用户定义类型看起来像这样(AzureADUser表中的列也是如此)。
01: ImmutableId varchar 255 UNIQUE
02: displayName varchar 255
03: UserPrincipalName varchar 255 UNIQUE
04: ObjectId uniqueidentifier 16 UNIQUE
我的存储过程看起来像这样(如果我在这里弄错了,我将包括整个ALTER脚本)。
USE [WAGS]
GO
/****** Object: StoredProcedure [dbo].[spUpdateAzureADUsersTable] Script Date: 20/10/2020 15:59:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spUpdateAzureADUsersTable] (@users [dbo].[AzureADUser] READONLY)
AS
INSERT INTO [dbo].[AzureADUsers]
(
ImmutableId,displayName,UserPrincipalName,ObjectId
)
SELECT * FROM @users
我正在尝试使用Invoke-sqlCmd PowerShell cmdlet调用存储过程,如下所示:
解决方法
结果证明Microsoft SQL PowerShell模块具有许多错误/局限性。存储过程,类型和表均已正确创建,问题是我是如何使用PowerShell从PowerShell调用它的(或者更确切地说,是我如何传递值的数组)。
我最终借助此章http://tomaslind.net/2016/05/27/from-powershell-to-sql-tables/
进入Powershell的ADO.NET。注意:创建大型数据表时,使用[void]而不是管道输出到Out-Null更快。
我的PowerShell现在看起来像这样:
$azureAdUsers = Get-AzureADUser -All $true | ? { $_.ImmutableId }
$dataTable = [System.Data.DataTable]::New()
[void]($dataTable.Columns.Add("ObjectId","System.Guid"))
[void]($dataTable.Columns.Add("ImmutableId","System.String"))
[void]($dataTable.Columns.Add("DisplayName","System.String"))
[void]($dataTable.Columns.Add("UserPrincipalName","System.String"))
foreach($u in $azureAdUsers)
{
[void]($dataTable.Rows.Add($u.ObjectId,$u.ImmutableId,$u.DisplayName,$u.UserPrincipalName))
}
$ServerInstance = "MERCURY\SQLEXPRESS"
$DatabaseName = "WAGS"
$ConnString = "Server=$ServerInstance;Database=$DatabaseName;Integrated Security=SSPI;"
$conn = New-Object System.Data.SqlClient.SqlConnection $ConnString
$conn.Open()
$query = "dbo.spUpdateAzureADUsersTable"
$cmd = New-Object System.Data.SqlClient.SqlCommand
$cmd.Connection = $conn
$cmd.CommandType = [System.Data.CommandType]"StoredProcedure"
$cmd.CommandText = $Query
$cmd.Parameters.Add("@users",[System.Data.SqlDbType]::Structured) | Out-Null
$cmd.Parameters["@users"].Value = $dataTable
$cmd.ExecuteNonQuery() | Out-Null
$conn.Close()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。