gpt4 book ai didi

sql - 将参数数组传递给存储过程

转载 作者:行者123 更新时间:2023-12-03 05:20:25 25 4
gpt4 key购买 nike

我需要将“id”数组传递给存储过程,以删除表中的所有行(除了与数组中的 id 匹配的行之外)。

我怎样才能以最简单的方式做到这一点?

最佳答案

如果您使用的是 Sql Server 2008 或更高版本,则可以使用称为表值参数 (TVP) 的东西,而不是每次想要将列表数据传递给存储过程时序列化和反序列化列表数据。

让我们首先创建一个简单的架构作为我们的 Playground :

CREATE DATABASE [TestbedDb]
GO


USE [TestbedDb]
GO

/* First, setup the sample program's account & credentials*/
CREATE LOGIN [testbedUser] WITH PASSWORD=N'µ×?
?S[°¿Q­¥½q?_Ĭ¼Ð)3õļ%dv', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
GO

CREATE USER [testbedUser] FOR LOGIN [testbedUser] WITH DEFAULT_SCHEMA=[dbo]
GO

EXEC sp_addrolemember N'db_owner', N'testbedUser'
GO


/* Now setup the schema */
CREATE TABLE dbo.Table1 ( t1Id INT NOT NULL PRIMARY KEY );
GO

INSERT INTO dbo.Table1 (t1Id)
VALUES
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9),
(10);
GO

有了我们的架构和示例数据,我们现在就可以创建 TVP 存储过程了:

CREATE TYPE T1Ids AS Table (
t1Id INT
);
GO


CREATE PROCEDURE dbo.FindMatchingRowsInTable1( @Table1Ids AS T1Ids READONLY )
AS
BEGIN
SET NOCOUNT ON;

SELECT Table1.t1Id FROM dbo.Table1 AS Table1
JOIN @Table1Ids AS paramTable1Ids ON Table1.t1Id = paramTable1Ids.t1Id;
END
GO

有了我们的架构和 API,我们就可以从我们的程序中调用 TVP 存储过程,如下所示:

        // Curry the TVP data
DataTable t1Ids = new DataTable( );
t1Ids.Columns.Add( "t1Id",
typeof( int ) );

int[] listOfIdsToFind = new[] {1, 5, 9};
foreach ( int id in listOfIdsToFind )
{
t1Ids.Rows.Add( id );
}
// Prepare the connection details
SqlConnection testbedConnection =
new SqlConnection(
@"Data Source=.\SQLExpress;Initial Catalog=TestbedDb;Persist Security Info=True;User ID=testbedUser;Password=letmein12;Connect Timeout=5" );

try
{
testbedConnection.Open( );

// Prepare a call to the stored procedure
SqlCommand findMatchingRowsInTable1 = new SqlCommand( "dbo.FindMatchingRowsInTable1",
testbedConnection );
findMatchingRowsInTable1.CommandType = CommandType.StoredProcedure;

// Curry up the TVP parameter
SqlParameter sqlParameter = new SqlParameter( "Table1Ids",
t1Ids );
findMatchingRowsInTable1.Parameters.Add( sqlParameter );

// Execute the stored procedure
SqlDataReader sqlDataReader = findMatchingRowsInTable1.ExecuteReader( );

while ( sqlDataReader.Read( ) )
{
Console.WriteLine( "Matching t1ID: {0}",
sqlDataReader[ "t1Id" ] );
}
}
catch ( Exception e )
{
Console.WriteLine( e.ToString( ) );
}
/* Output:
* Matching t1ID: 1
* Matching t1ID: 5
* Matching t1ID: 9
*/

可能有一种不太痛苦的方法可以使用更抽象的 API(例如 Entity Framework )来完成此操作。不过,我现在没有时间亲自去看看。

关于sql - 将参数数组传递给存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1069311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com