2011-02-02 4 views
1

내가 여기에 약간의 문제가 있습니다 모두 내가 원하는 샘플 코드SQL 매개 변수 숯불 []

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 절에 전달됩니다. 잘 작동하는 숫자로 시도했지만 제대로 작동하지 않는 char. 은 내가 무슨 짓을하는 것은 'A'등이

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) 

출력, 'B', 'C'와 같다. 하지만이 @ 고양이를 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- recor/2837662 # 2837662) –

+0

귀하의 권리. 주목 해 주셔서 감사합니다. 나의 영어는 나쁘다. 그리고이 본문은 나의 불에 의해 훼손된다. 보통 나는 ** 텍스트를 쓰지 않는다. 왜냐하면 내가 찾은 해결책이 인터넷에 있기 때문이다. – ABI

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) 

한 참고 : 당신이 그 (것)들에게 당신의 매개 변수가 항상 char(1), 당신이 시도 할 수있다 경우 그 방법과 를 전달할 수 경우이, SQL 서버 2005 +에 존재하는 시스템 테이블입니다 이전 버전에 대해서는 잘 모릅니다. 그리고 너는 너의 것을 언급하지 않았다.

0

이 여전히 동적 SQL,하지만 당신은

select * from Sections where name in ('A','B','C') 

같은 문자열을 구축하고 간부를 사용하여 실행할 수 있습니다. 나 자신에 대해 한 번 작성, 사용자 정의 함수 -

예를 들어

declare @Names nvarchar(80) 
declare @command nvarchar(80) 
set @Names ='''A'',''B'',''C''' 
set @command = 'select * from Sections where name in (' + @Names + ')' 

exec (@str)