微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用具有表值参数的存储过程,使用PowerShell填充时态SQL DB表

如何解决使用具有表值参数的存储过程,使用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调用存储过程,如下所示:

$azureAdUsers = Get-AzureADUser -All $true | ? { $_.ImmutableId }

$data = $azureAdUsers | Select ImmutableId,ObjectId

Invoke-sqlcmd -ServerInstance 'MERCURY\sqlEXPRESS' -Database 'WAGS' -QUERY "EXEC spUpdateAzureADUsersTable $data"

解决方法

结果证明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 举报,一经查实,本站将立刻删除。