Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truyền một mảng tham số vào một thủ tục được lưu trữ

Nếu bạn đang sử dụng Sql Server 2008 trở lên, bạn có thể sử dụng một cái gì đó được gọi là Tham số bảng giá trị (TVP) thay vì tuần tự hóa &giải mã hóa dữ liệu danh sách của bạn mỗi khi bạn muốn chuyển nó vào một thủ tục được lưu trữ.

Hãy bắt đầu bằng cách tạo một giản đồ đơn giản để làm sân chơi của chúng ta:

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

Với lược đồ và dữ liệu mẫu của chúng tôi đã có sẵn, giờ đây chúng tôi đã sẵn sàng tạo quy trình được lưu trữ TVP của chúng tôi:

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

Với cả lược đồ và API của chúng tôi, chúng tôi có thể gọi quy trình được lưu trữ TVP từ chương trình của chúng tôi như sau:

        // 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
   */

Có lẽ có một cách ít đau đớn hơn để thực hiện việc này bằng cách sử dụng một API trừu tượng hơn, chẳng hạn như Entity Framework. Tuy nhiên, tôi không có thời gian để tận mắt chứng kiến ​​vào lúc này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để kết nối máy chủ sql với php bằng xampp?

  2. Không thực hiện được tác vụ SSIS khi mặt nạ để chọn tệp được tải lên máy chủ FTP bằng WinSCP không khớp với tệp nào

  3. Cách thực thi sp_send_dbmail trong khi giới hạn quyền

  4. Làm cách nào để xóa khỏi nhiều bảng bằng INNER JOIN trong máy chủ SQL

  5. Cách thêm hàng trống khi chọn truy vấn sql