我在这里遇到的一点问题是示例代码
create table Sections (ID int, name char(1), Description nvarchar(50))
insert into Sections values (1,'A','A Section')
insert into Sections values (2,'B','B Section')
insert into Sections values (3,'C','C Section')
insert into Sections values (4,'D','D Section')
insert into Sections values (5,'E','E Section')
insert into Sections values (6,'F','F Section')
select * from Sections
declare @Names nvarchar(10) ='A,B,C';
select *from Sections where name in (@Names)
我想要的是,我将传递一个字符串,该字符串将被分割为每个char,并且该char数组将在where子句中传递。 我用数字试过它工作正常,但在char它不能正常工作。 我所做的就像这样
declare @Categories nvarchar(50)='ABC';
declare @array nvarchar(50);
declare @lenth int =len(@Categories);
Declare @c int =1;
declare @param nvarchar(50)='' ;
while @c <=@lenth
begin
set @param = @param + ''''+ SUBSTRING(@Categories ,@c,1) +''''+','
set @c =@c+1
end
print @param
declare @Cats nvarchar(50);
set @Cats= substring(@param, 0,len(@param)-0)
它的输出像'A','B','C'。但是当我将这个@Cats传递给sp时,这将不会返回任何记录。
还有一件事我不赞成将此查询作为动态查询执行。
答案 0 :(得分:1)
我可以在你的第二个脚本中看到原来你没有,
分隔符的params。 如果你可以通过这种方式传递它们,如果你的参数总是char(1)
,那么你可以试试这个:
DECLARE @Categories nvarchar(50) = 'ABC';
SELECT s.*
FROM Sections s
INNER JOIN master..spt_values v ON v.type = 'P'
AND v.number BETWEEN 1 AND LEN(@Categories)
WHERE s.name = SUBSTRING(@Categories, v.number, 1)
关于master..spt_values
的一个注释:这是SQL Server 2005+中存在的系统表,我不知道早期版本。你没有提到你的是什么。
答案 1 :(得分:1)
另外,你可以使用这个UDF - 用户定义的函数,我为自己写了一次。
CREATE FUNCTION [dbo].[fnSplit]
(
@Value nvarchar(max),
@Seprator nvarchar(5)
)
RETURNS @Table TABLE
(
val NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @XML XML
SET @XML = N'<root><r>'+REPLACE(@VALUE,@SEPRATOR,'</r><r>')+'</r></root>'
INSERT INTO @Table(val) SELECT x.value('.','NVARCHAR(MAX)') FROM @XML.nodes('//root/r') AS records(x)
RETURN
END
要使用此功能,请参阅以下内容:
dbo.fnSplit (输入列表 字符串,拆分器 字符串)返回表格强>
使用示例:
declare @Sections table (ID int, name char(1), Description nvarchar(50))
declare @Names nvarchar(10) ='C,B';
insert into @Sections values (1,'A','A Section')
insert into @Sections values (2,'B','B Section')
insert into @Sections values (3,'C','C Section')
select *from @Sections where name in (Select val from dbo.fnSplit(@names,','))
答案 2 :(得分:0)
这仍然是动态sql,但你可以建立一个像
这样的字符串select * from Sections where name in ( 'A','B','C')
然后使用exec执行它。
例如
declare @Names nvarchar(80)
declare @command nvarchar(80)
set @Names ='''A'',''B'',''C'''
set @command = 'select * from Sections where name in ( ' + @Names + ')'
exec (@str)