我试图在C#中编写一个应用程序来将包含多个以逗号分隔的值的变量传递给存储过程
string state = "AZ, CA, VA"
我希望我的存储过程返回变量
中每个状态的所有数据CREATE PROCEDURE usp_GetStateInfo
@state varchar(2)
SELECT * FROM StateTable WHERE state IN (@state)
但是,当我执行上面的代码时,我收到一条错误,上面写着'语法错误' 我做错了什么,如何解决这个问题?
谢谢
答案 0 :(得分:1)
您不能将多个输入用作IN语句的参数。您必须在SQL中拆分这些逗号分隔值以创建表变量并与该表变量连接。
您可以创建一个用于拆分输入字符串的函数: -
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[udf_PutStringtoTableUnique]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[udf_PutStringtoTableUnique]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE function [dbo].[udf_PutStringtoTableUnique]
(
@inputStr as varchar(max),
@delim nchar(1) = N','
)
returns @tbl table(ID int primary key)
as
BEGIN
if @inputStr = '' or @inputStr is null
return
declare @tags nchar(2)
set @tags = @delim + @delim;
with tbl_for_csv as
(
select left(@inputStr + @tags,charindex(@delim,@inputStr + @tags) -1)as Col,
right(@inputStr + @tags,len(@inputStr + @tags) - charindex(@delim,@inputStr + @tags)) as Str
union all
select left(Str,charindex(@delim,Str) - 1)as Col,
right(Str,len(Str) - charindex(@delim,Str)) from tbl_for_csv
where len(right(Str,len(Str) - charindex(@delim,Str))) > 0
)
insert into @tbl
select distinct Col from tbl_for_csv
option (maxrecursion 0)
return
END
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER ON
GO
然后在程序中写下这样的东西: -
DECLARE @TempStates Table (StateName Varchar(2))
INSERT INTO @TempStates
Select id from [dbo].[udf_PutStringtoTableUnique](@state, ',')
SELECT * FROM StateTable
INNER JOIN @TempStates temp ON state = temp.StateName
答案 1 :(得分:1)
IN
运算符接受值的内联列表或select
语句。 SQL中没有本地list
类型的变量。当然,varchar(2)
无法正常工作。
当您使用C#时,循环遍历状态列表,调用每个元素的存储过程是有意义的。该过程将使用=
代替IN
来过滤状态。
如果您坚持该过程接受一串逗号分隔值,那么您必须使用SQL命令拆分字符串并将每个值插入临时表或表变量,然后使用{{1}用于select
消费的语句。
在T-SQL中,您可以使用IN
为SQL Server 2016执行此操作
https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql
STRING_SPLIT()