T-SQL: как это сделать: выберите * из xy, где uid в (@parameter) - PullRequest
2 голосов
/ 19 июля 2011

Вопрос:

Как это сделать:

DECLARE @StateUID varchar(max)  

SET @StateUID = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53, 66E57225-642F-45B5-8E5D-070F2D1CF99D, 751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 


SELECT StateFullName, StateAbbrv, StateID
FROM tblStates 
WHERE StateUID IN ( @StateID )

Выполнение string.join, как показано ниже, также не помогает:

SET @StateUID = '''E8812237-2F3B-445E-8EEF-020E0B6F6A53'', ''66E57225-642F-45B5-8E5D-070F2D1CF99D'', ''751C615B-EB9C-4D25-955D-0E0EB3CD05A2''' 




Теперь я переместил его в динамический SQL, где он работает.

Но это чрезвычайно подвержено ошибкам, раздражает и отнимает много времени, поэтому я хотел спросить, есть ли какой-нибудь ненормальный способ сделать это (без временных таблиц, функций и т. Д.)?

Ответы [ 4 ]

4 голосов
/ 19 июля 2011

Посмотрите на эту ссылку -

http://www.sommarskog.se/arrays-in-sql.html

Есть также этот вопрос, который я помню, обсуждаемый в подкасте переполнения стека, он проходит через ряд различных методов (невсе они связаны с хранимыми процедурами) -

Параметризация предложения SQL IN

3 голосов
/ 19 июля 2011

В этом случае кажется, что вы можете использовать «как»

DECLARE @QueryUIDs  varchar(MAX)
SET @QueryUIDs = '''E8812237-2F3B-445E-8EEF-020E0B6F6A53'', ''66E57225-642F-45B5-8E5D-070F2D1CF99D'', ''751C615B-EB9C-4D25-955D-0E0EB3CD05A2''' 

SELECT StateFullName, StateAbbrv, StateUID
FROM tblStates 
WHERE @QueryUIDs LIKE '%' + CAST(StateUID AS CHAR(36)) + '%'
1 голос
/ 19 июля 2011

Один из вариантов - проанализировать строку с разделителями-запятыми в подзапросе. В приведенном ниже коде предполагается, что вы можете удалить пробелы из строки @StateUID, а StateID является уникальным идентификатором:

DECLARE @StateUID varchar(max), @xml xml  

SET @StateUID = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53,' + 
    '66E57225-642F-45B5-8E5D-070F2D1CF99D,' + 
    '751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 

SET @xml = '<root><r>' + replace(@StateUID,',','</r><r>') + '</r></root>'

SELECT StateFullName, StateAbbrv, StateID
FROM tblStates 
WHERE StateID IN ( 
    SELECT
      CONVERT(uniqueidentifier, t.value('.','varchar(36)')) as [id]
    FROM @xml.nodes('//root/r') as a(t)
) 

Есть много замечательных функций разделения строк , но использование XML - мой любимый.

0 голосов
/ 19 июля 2011

если вам не нравятся временные таблицы и массивы, вы можете использовать более одной переменной:

DECLARE @StateUID_1 varchar(max)  
DECLARE @StateUID_2 varchar(max)  
DECLARE @StateUID_3 varchar(max)  

SET @StateUID_1 = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53'
SET @StateUID_2 = '66E57225-642F-45B5-8E5D-070F2D1CF99D'
SET @StateUID_3 = '751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 


SELECT StateFullName, StateAbbrv, StateID
FROM tblStates 
WHERE StateUID IN ( @StateUID_1, @StateUID_2, @StateUID_3 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...