2013-01-14 43 views
-1

Possible Duplicate:
Parameterizing an SQL IN clause?
Passing an array of parameters to a stored procedure傳遞唯一標識符的陣列存儲過程

我需要唯一標識符的集合傳遞給我的存儲過程。我寫了這個查詢來測試我想要做什麼:

SELECT * 
FROM MyTable 
WHERE MyTable.TypeId IN ('852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82') 

此查詢運行正確。所以我創造了這個存儲過程:

CREATE PROCEDURE [dbo].[MySproc] (
@TypeIdsList varchar(8000) 
) AS 

BEGIN 
EXEC(
    'SELECT * 
    FROM MyTable 
    WHERE MyTable.TypeId IN (' + @TypeIdsList + ')' 
) 
END 

但是,當我用一些樣本數據執行它:

DECLARE @return_value int 

EXEC @return_value = [dbo].[MySproc] 
     @TypeIdsList = N'852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82' 

SELECT 'Return Value' = @return_value 

GO 

我得到這個錯誤:

Incorrect syntax near 'D7F39'.

任何人都知道我在做什麼錯誤?

回答

2
<ids> 
    <id value='852D7F39-302A-4E35-94D4-9A0335F8E9DC'/> 
    <id value='1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'/> 
</ids> 

create procedure [dbo].[MySproc] (@TypeIdsList xml) 
as 
begin 

    declare @idoc int 
    exec sp_xml_preparedocument @idoc output, @TypeIdsList 
    create table #ids (id uniqueidentifier) 

    insert into #ids 
      select a.value 
       from openxml (@idoc, '/ids/id',1) 
      with (value uniqueidentifier) a 

    select t.* 
     from MyTable t 
      inner join #ids i with (nolock) on t.TypeId = i.id  

-- or 
-- SELECT t.* 
-- FROM MyTable t 
-- WHERE t.TypeId IN (SELECT i.id FROM #ids WITH(NOLOCK)) 
end 
:剛剛在常規的SQL使用 charindex()like這可能是更容易
0

我很困惑。你的意思是你的第一個查詢運行正確嗎?對於一個人(至少是這個人)來說,您似乎在尋找兩個值:'852D7F39-302A-4E35-94D4-9A0335F8E9DC''1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'。但是,SQL會將您的表達式解釋爲其中一個值,'852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82',其中包含逗號。

您的存儲過程似乎希望將其變爲兩個值。但是,您對逗號有問題。你需要這樣的東西:

WHERE MyTable.TypeId IN (''' + replace(@TypeIdsList, ',', '''') + ''')' 

哦,那動態SQL可能會讓人困惑。

where charindex(','+MyTable.TypeId+',' , ','[email protected]+',') > 0 

where ','[email protected]+',' like '%,'+MyTable.TypeId+',%'