将数据表传递给SQL Server中的存储过程
创建一个表:
CREATE TABLE dbo.TestTableVariable
(
ID INT IDENTITY(1,1) primary key,
Name VARCHAR(10),
Addr VARCHAR(10)
)
创建需要传的表:
CREATE TYPE dbo.TableVariable AS TABLE
(
ID INT
)
插入一些默认数据:
INSERT INTO dbo.TestTableVariable VALUES ('aaa', 'addr-aaa')
INSERT INTO dbo.TestTableVariable VALUES ('bbb', 'addr-bbb')
INSERT INTO dbo.TestTableVariable VALUES ('ccc', 'addr-ccc')
INSERT INTO dbo.TestTableVariable VALUES ('ddd', 'addr-ddd')
创建具有表变量作为参数的存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE dbo.SelectTestTableVariable
(
@TableVar dbo.TableVariable READONLY
)
AS
BEGIN
SET NOCOUNT ON;
SELECT ID, Name, Addr FROM dbo.TestTableVariable
WHERE ID IN (SELECT ID FROM @TableVar)
END
GO
这是控制台应用程序的C#代码:
static void Main(string[] args)
{
DataSet dataset = new DataSet();
DataTable dataTable = new DataTable();
dataTable.Columns.Add("ID");
var dr = dataTable.NewRow();
dr["ID"] = 1;
dataTable.Rows.Add(dr);
using (SqlConnection conn = new SqlConnection(
@"Data Source=.\SqlExpress;Initial Catalog=Work;Integrated Security=True;"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("[dbo].[SelectTestTableVariable]"))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn;
cmd.Parameters.AddWithValue("@TableVar", dataTable);
using (SqlDataAdapter adp = new SqlDataAdapter(cmd))
{
adp.Fill(dataset);
}
}
}
}