SORU
19 HAZİRAN 2012, Salı


Nasıl bir SQL Server saklı yordamını bir dizi geçirilecek

Nasıl bir SQL Server saklı yordamını bir dizi geçirilecek?

Örneğin, çalışanların listesi var. Bir tablo olarak bu listeyi kullanın ve başka bir tablo ile katılmak istiyorum. Ama liste çalışanları parametre olarak geçirilmesi C#.

CEVAP
19 HAZİRAN 2012, Salı


Bir Liste zaten var olduğundan, XML olduğundan çok daha basit yolları var.

SQL Server 2008 (veya daha yeni)

Öncelikle veritabanınızda aşağıdaki iki nesne oluşturun:

CREATE TYPE dbo.EmployeeList
AS TABLE
(
  EmployeeID INT
);
GO

CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List AS dbo.EmployeeList READONLY
AS
BEGIN
  SET NOCOUNT ON;

  SELECT EmployeeID FROM @List; 
END
GO

Şimdi C# kod:

DataTable tvp = new DataTable();
// define / populate DataTable from your List here

using (conn)
{
    SqlCommand cmd = new SqlCommand("dbo.DoSomethingWithEmployees", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@List", tvp);
    tvparam.SqlDbType = SqlDbType.Structured;
    // execute query, consume results, etc. here
}

SQL Server 2005

Eğer SQL Server kullanıyorsanız, 2005, hala XML ikiye bölünmüş bir fonksiyon tavsiye ederim. İlk olarak, bir işlev oluşturun:

CREATE FUNCTION dbo.SplitInts
(
   @List      VARCHAR(MAX),
   @Delimiter VARCHAR(255)
)
RETURNS TABLE
AS
  RETURN ( SELECT Item = CONVERT(INT, Item) FROM
      ( SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
        FROM ( SELECT [XML] = CONVERT(XML, '<i>'
          REPLACE(@List, @Delimiter, '</i><i>')   '</i>').query('.')
          ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
      WHERE Item IS NOT NULL
  );
GO

Şimdi saklı yordam olabilir:

CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List VARCHAR(MAX)
AS
BEGIN
  SET NOCOUNT ON;

  SELECT EmployeeID = Item FROM dbo.SplitInts(@List, ','); 
END
GO

Ve C# sadece '1,2,3,12'... . liste kabul kodu

Seçtiğiniz yönteme karşı bu seçenekler bakımı ve performansını karşılaştırmak tavsiye ederim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Atlantic Records

    Atlantic Rec

    15 Aralık 2006
  • Jejoab

    Jejoab

    4 NİSAN 2008
  • RinconDynamic

    RinconDynami

    1 EKİM 2011