SQL参数为Char []

时间:2011-02-02 10:21:58

标签: sql sql-server

我在这里遇到的一点问题是示例代码

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时,这将不会返回任何记录。

还有一件事我不赞成将此查询作为动态查询执行。

3 个答案:

答案 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)