gpt4 book ai didi

c# - 存储过程中EXISTS子句的参数

转载 作者:太空宇宙 更新时间:2023-11-03 18:13:16 25 4
gpt4 key购买 nike

我有一个表DEPT,其中包含2列-ID, NAME

将显示一个搜索表单,其中包含DEPT表中的ID,用户可以选择任意数量的ID并提交表单,以获取相关的NAMEs

澄清/输入:


我不想建立动态查询-它不可管理。
我更喜欢使用表值参数的存储过程


还有其他解决方案吗?

注意:
这个例子很简单,只有1个表-在现实生活中,我必须处理6个以上的表!

谢谢你的建议

最佳答案

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#代码中,创建一个DataTable,将其填充ID,然后将其传递给存储过程。假设您已经有一个名为tempList的列表,并且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;
...
}


您还可以使用拆分功能。存在很多,这是我喜欢的一种,如果您可以保证输入是安全的(没有<,>等):

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

关于c# - 存储过程中EXISTS子句的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10744245/

25 4 0
文章推荐: html - 我无法将谷歌字体和天气小部件添加到 Github 页面
文章推荐: html -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com