CREATE TYPE dbo.DeptList
AS TABLE
(
ID INT
);
GO
CREATE PROCEDURE dbo.RetrieveDepartments
@dept_list AS dbo.DeptList READONLY
AS
BEGIN
SET NOCOUNT ON;
SELECT Name FROM dbo.table1 WHERE ID IN (SELECT ID FROM @dept)
UNION ALL
SELECT Name FROM dbo.table2 WHERE ID IN (SELECT ID FROM @dept)
-- ...
END
GO
现在在您的 C# 代码中, 请创建一个数据表, 填入 ID, 并将它传送到存储程序 。 假设您已经有一份名为临时列表的清单, 并且 ID 存储在 ID 中 :
DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("ID"));
foreach(var item in tempList)
{
tvp.Rows.Add(item.id);
}
using (connObject)
{
SqlCommand cmd = new SqlCommand("StoredProcedure", connObject);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter tvparam = cmd.Parameters.AddWithValue("@dept_list", tvp);
tvparam.SqlDbType = SqlDbType.Structured;
...
}
您也可以使用分割函数。 许多函数存在, 如果您可以保证输入是安全的, 这是我喜欢的 。 (没有 & lt;, & gt;, & amp; 等) :
CREATE FUNCTION dbo.SplitInts_XML
(
@List VARCHAR(MAX),
@Delimiter CHAR(1)
)
RETURNS TABLE
AS
RETURN
(
SELECT Item = y.i.value( (./text())[1] , int )
FROM
(
SELECT x = CONVERT(XML, <i>
+ REPLACE(@List, @Delimiter, </i><i> ) + </i> ).query( . )
) AS a
CROSS APPLY x.nodes( i ) AS y(i)
);
GO
现在,您的程序可以是:
CREATE PROCEDURE dbo.RetrieveDepartments
@dept_list VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
;WITH d AS (SELECT ID = Item FROM dbo.SplitInts(@dept_list, , ))
SELECT Name FROM dbo.table1 WHERE ID IN (SELECT ID FROM d)
UNION ALL
SELECT Name FROM dbo.table2 WHERE ID IN (SELECT ID FROM d)
-- ...
END
GO