2015-01-22 4 views
0

У меня есть хранимые процедуры, которые принимают список, разделенный запятыми, а затем делают копии этого списка с цитированными строками и скобками, а затем используют те, которые содержатся в динамической инструкции sql, для создания сводной таблицы с гибким числом колонны.SQL создает отдельные разделенные запятой списки

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

Вот как я манипулируют начальную строку:

Declare @data varchar(max) = '150593, 150593, 150603, 150578, 150604' 

Declare @bracketed varchar(max) = '' 
Declare @quoted varchar(max) = '' 

select @bracketed = @bracketed + quotename(rtrim(ltrim(Value))) + ', ', 
     @quoted = @quoted + quotename(rtrim(ltrim(Value)), '''') + ', ' 
from [dbo].[fnSplitStringAsTable](@data, ',') 

Select @bracketed = LEFT(@bracketed, len(@bracketed) - 1), 
     @quoted = LEFT(@quoted, len(@quoted) - 1) 

Я думаю, что я должен быть в состоянии добавить DISTINCT где-то в этом запросе,
, но я не могу заставить его работать. Как выбрать отдельный список, разделенный запятыми?

+0

http://stackoverflow.com/questions/10298805/mimic-group-concat-combined-with-group-by –

+0

@AaronBertrand - как вы помните ответы от 3 лет назад ... Я не помню, что я сказал на прошлой неделе. – Hogan

+0

@AaronBertrand - Пока я согласен, что ваша память впечатляет, можете ли вы сказать мне, какая часть этого сообщения является relavent? Я не вижу этого ... – MAW74656

ответ

0

Я думаю, мы можем добавить в отличие после сделать таблицу, как это:

select @bracketed = @bracketed + quotename(rtrim(ltrim(Value))) + ', ', 
     @quoted = @quoted + quotename(rtrim(ltrim(Value)), '''') + ', ' 
from (
    SELECT DISTINCT Value FROM [dbo].[fnSplitStringAsTable](@data, ',') 
) T 

Если это не удается, попробуйте это:

select @bracketed = @bracketed + quotename(Value) + ', ', 
     @quoted = @quoted + quotename(Value), '''') + ', ' 
from (
    SELECT DISTINCT RTRIM(LTRIM(Value)) AS Value FROM [dbo].[fnSplitStringAsTable](@data, ',') 
) T 
+0

-Искушение своей простоты, но не устраняет дубликатов. Также необходим псевдоним для подзапроса. – MAW74656

+0

@ MAW74656 - Почему он не устраняет дубликаты? Это не удалось в вашем тесте? – Hogan

+0

Нет подсказки .... но это не так. Мой тест по-прежнему вызывает ошибку 'Столбец '150593' был указан несколько раз для 'p'' – MAW74656

0

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

declare @data varchar(max) = '150593, 150593, 150603, 150578, 150604' 
declare @table table(data varchar(10)) 

set @data = 'select distinct value from (values (''' + 
     replace(@data,', ','''),(''') + ''')) as v(value)' 

insert into @table 
    exec(@data) 

set @data = '' 
select @data = @data + data + 
    case row_number() over(order by data desc) 
     when 1 then '' 
     else ',' 
    end 
from @table 
order by data asc 

select @data 
+0

Он уже использует функцию, чтобы поместить значения в таблицу - почему бы просто не манипулировать этим и не сходить с ума с помощью трюков с текстом? – Hogan

+1

@RonSmith - Хоган прав, хотя мне нравится трюк row_number для выяснения, нужна ли вам запятая или нет. – MAW74656

4

в качестве альтернативного решения можно DeDupe в XML и преобразовать обратно в VARCHAR

Declare @data varchar(max) = '150593, 150593, 150603, 150578, 150604' 
set @data= (select '''' + cast(cast('<d>'+replace(@data, ', ',',</d><d>')+'</d>' as xml).query('distinct-values(/d)') as varchar) +'''') 
select @data 
+0

Это пятно @ Джейве! –

Смежные вопросы