2011-02-02 61 views
1

所有我有在這裏一個小問題是示例代碼SQL參數爲char []

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) 

我想要的是,我將傳遞一個字符串,字符串將被splited到每個字符和字符數組將在where子句中傳遞。 我試過它與數字,工作正常,但在字符它無法正常工作。 我所做的就是這樣

declare @Categories nvarchar(50)='ABC'; 
declare @array nvarchar(50); 
declare @lenth int =len(@Categories); 
Declare @c int =1; 
declare @param nvarchar(50)='' ; 

while @c <[email protected] 
begin 
set @param = @param + ''''+ SUBSTRING(@Categories ,@c,1) +''''+',' 
set @c [email protected]+1 

end 
print @param 

declare @Cats nvarchar(50); 
set @Cats= substring(@param, 0,len(@param)-0) 

它的輸出,如 'A', 'B', 'C'。但是當我將這個@Cats傳遞給sp時,這將不會返回任何記錄。

還有一件事我不贊成將這個查詢作爲動態查詢來執行。

回答

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,',')) 
+0

[您自己寫了哪個位?](http://stackoverflow.com/questions/314824/t-sql-opposite-to-string-concatenation-how-to-split-string-into-multiple-記錄/ 2837662#2837662) – 2011-02-02 18:28:04

1

我可以在你的第二個腳本中看到原本你有你的參數沒有,分隔符。 如果你可以通過他們的方式和如果您參數總是char(1),那麼你可以試試這個:在master..spt_values

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) 

一注:這是存在於SQL Server的2005+系統表,我不知道早期版本。而你沒有提到你的是什麼。

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)