我有一些SQL通过盲目需求/请求转换为存储过程。在我看到的应用程序中有一点SQL使用动态IN(set)语句构建where子句。我已经搜索了动态存储过程,但没有接近我正在寻找的东西对我来说。这里是WHERE子句的示例:如何使用动态创建的IN集创建存储过程
WHERE Var.A = @Param AND Var.Id IN
从这里SQL是使用字符串生成器手动构建的,然后执行。不知道如何将它转换为存储过程,因为我对它们相当陌生。
我们正在使用C#和SQL Server
我有一些SQL通过盲目需求/请求转换为存储过程。在我看到的应用程序中有一点SQL使用动态IN(set)语句构建where子句。我已经搜索了动态存储过程,但没有接近我正在寻找的东西对我来说。这里是WHERE子句的示例:如何使用动态创建的IN集创建存储过程
WHERE Var.A = @Param AND Var.Id IN
从这里SQL是使用字符串生成器手动构建的,然后执行。不知道如何将它转换为存储过程,因为我对它们相当陌生。
我们正在使用C#和SQL Server
您可以使用用户定义的数据类型。
在C#方面,它应该是这样的:
//Setup a DataTable with the same structure as the SQL Type
var data = new DataTable();
data.Columns.Add("value", typeof(string));
//Populate the table
data.Rows.Add("oneID");
data.Rows.Add("anotherID");
//You create your sql command
cmd.Parameters.Add("@listArgument", data);
//Command execution
SQL一边,你可以有一种这样的
CREATE TYPE [dbo].[NVarCharTable] AS TABLE (
[value] NVARCHAR(MAX) NOT NULL);
然后存储过程:
CREATE PROCEDURE [dbo].[MyProc]
@listArgument NVarCharTable READONLY
AS
BEGIN
SELECT *
FROM FOO
WHERE Var.Id IN (Select [value] FROM @listArgument)
END
参考:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters
如果您使用的是SQl SERVER 2016或更高版本,则可以使用string_split函数将csv参数转换为表格,然后将其用于您的IN列表中。
SELECT * FROM TBL WHERE Var.A = @Param AND Var.Id IN (SELECT value FROM STRING_SPLIT(@inlist, ','))
希望这有助于
上捎带关闭@lostmylogin的,你可以通过在界定的参数,并使用这些SQL函数来解析为一个表:
http://sqlservercentral.com/scripts/SUBSTRING/124330 或 http://sqlservercentral.com/scripts/Miscellaneous/31913
如何将用户定义的表格类型从C#发送到proc? – hardkoded
这听起来不错。但我不知道这意味着什么。我会研究这个角度。谢谢大声笑 – Matt1776
@ Matt1776:根据各种因素,IN子句可以是从良性到病态的不良表现。由于IN子句的目的是过滤返回的行,INNER JOIN子句也是这样做的(除了引入额外的列之外),执行INNER JOIN而不是IN会比较好,而且往往会更好。 (回想一下,INNER JOIN只返回两个表中匹配连接字段的行。) –