Создать переменные на основе условия в SQL? - PullRequest
0 голосов
/ 15 мая 2019

Можете ли вы создавать переменные на основе условий в SQL-сервере?

например, я передам строку типа '2016,2017'

Мой запрос создаст 2 переменные, потому что он имеет 2 года

сейчас, если я пройду 10 лет в строке, например, '2010,2011,...'

Мой запрос тоже должен создать 10 переменных ...

Это вообще возможно?

EDIT:

ПСЕВДОКОД

declare @string as nvarchar(max) = '2014,2015,2016'
declare @count as int = (select LEN(REPLACE(@string, ',', '**')) - LEN(@string) )


while @count <> 0
begin

--create variable statement here
Declare @var + @count as nvarchar(max)

set @string = (select substring(@string,0,CHARINDEX(',', @string)))

set @var +@count = @string

set @count = count - 1


end


select @var1, @var2

OUTPUT

2014 2015

РЕДАКТИРОВАТЬ 2

Причина:

Я хочу иметь SP, который будет выводить запрошенные данные о продажах, так как я уже спросил здесь о том, как я могу получить данные, теперь мне было поручено сделать их динамичными, особенно за те годы, когда мы 15 лет. Запрашиваемые данные могут быть от 1 до 15 лет

Моя первая идея - провести годы в виде строки

exec SP_test '2014,2015,2016'

, что заставило меня задуматься о создании динамических переменных, чтобы я мог заменить годы в моем запросе, наряду с созданием строк, требуемых запросом для получения соответствующего результата

Полный код псевдо

declare @string as nvarchar(max) = '2014,2015,2016'
declare @count as int = (select LEN(REPLACE(@string, ',', '**')) - LEN(@string) )


while @count <> 0
begin

--create variable statement here
Declare @var + @count as nvarchar(max)

set @string = (select substring(@string,0,CHARINDEX(',', @string)))

set @var +@count = @string

set @count = count - 1


end

--up to this point lets say I have created @var1 and @var2

 SELECT Item,Price,Quantity,PriceYear,QuantityYear INTO TempFinal
    FROM (
    SELECT Item,Price,Quantity, 'Price+@var1' as PriceYear,'Quantity+@var1' as QuantityYear FROM @Table+@var1
    UNION ALL                                      
    SELECT Item,Price,Quantity, 'Price@var2' as PriceYear,'Quantity@var2' as QuantityYear FROM @Table+@var2
    ) MyTables

Это всего лишь пример, но запрос должен строить строки. В примере 2 года, поэтому запрос создал два оператора select (это еще одна проблема, но я думаю, что у меня может быть решение для этого) Затем уникальные поля с указанием лет.

  SELECT item, SUM([Price+@var1])[Price+@var1],SUM([Quantity+@var1])[Quantity+@var1],SUM([Price+@var2])[Price+@var2],SUM([Quantity+@var2])[Quantity+@var2]
    FROM (
    SELECT item,Price,Quantity,PriceYear,QuantityYear
    FROM TempFinal) up
    PIVOT (SUM(Quantity) FOR QuantityYear IN ([Quantity+@var2],[Quantity+@var2]) AS pvt
    PIVOT (SUM(Price) FOR PriceYear IN ([Price+@var1],[Price+@var2]) AS pvt2
    GROUP by item
    ORDER BY item

   --do take note that @var1 contains `2014` and @var2 contains `2015`

1 Ответ

0 голосов
/ 15 мая 2019

Насколько я знаю, невозможно динамически генерировать переменные таким образом, если вы не создадите свою логику SQL полностью динамически и не выполните ее с EXECUTE или sp_executesql.

.вместо этого используйте временную таблицу или переменную таблицы.Тогда эта таблица будет служить своего рода массивом.

declare @string as nvarchar(max) = '2010,2011,2012,2013,2014,2015,2016';

declare @vars as table ([index] int identity, [value] nvarchar(max));
declare @charindex as int = CHARINDEX(',', @string);
declare @value as nvarchar(max);

while @charindex > 0
begin
    set @value = substring(@string, 0, @charindex);
    set @string = substring(@string, @charindex + 1, LEN(@string));

    insert into @vars ([value]) values (@value);

    set @charindex = CHARINDEX(',', @string);
end;

select [index], [value] from @vars order by [index];

Извините, что немного подправил ваш код.Я хотел опубликовать рабочий пример (с указанием ожидаемого результата).

Дополнительное примечание:

Если вы также хотите включить последнее значение, возможно, вам придется добавить более сложную логику в вашкод ... или вы можете просто добавить дополнительную запятую к значению @string ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...