-1

我正在尝试用 C# 编写一个应用程序,它将一个包含多个用逗号分隔的值的变量传递给存储过程

string state = "AZ, CA, VA"

我希望我的存储过程返回变量中每个状态的所有数据

CREATE PROCEDURE usp_GetStateInfo
@state varchar(2)

SELECT * FROM StateTable WHERE state IN (@state)

但是当我执行上面的代码时,我收到一条错误消息“语法不正确”我做错了什么,我该如何解决这个问题?

谢谢

4

2 回答 2

1

IN运算符接受内联值列表或语句select。SQL中没有本机list类型的变量。当然varchar(2)不会像你一样工作。

当您使用 C# 时,循环遍历状态列表并为每个元素调用存储过程是有意义的。该过程将使用=而不是IN过滤状态。

如果您坚持该过程接受逗号分隔值的字符串,那么您将不得不使用 SQL 命令来拆分字符串并将每个值插入到临时表或表变量中,然后有一个select语句供IN使用。

在 T-SQL 中,您可以使用STRING_SPLIT()SQL Server 2016 https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql执行此操作

SELECT *
FROM StateTable
WHERE state IN(
    SELECT value
    FROM STRING_SPLIT(@states, ',') )
于 2017-12-08T20:02:37.063 回答
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 
于 2017-12-08T19:49:10.927 回答