Создайте глобальный постоянный список строк как переменную

Я использую SQL Server 2008 R2, в MS SQL Server Management Studio. Я только когда-либо делал Select и все стандартные вещи, но я часто использую одни и те же списки строк для разных запросов, и я хотел бы иметь возможность создавать переменные, которые их содержат. У меня нет прав доступа для создания новой таблицы, иначе я бы просто сделал это. Это вообще возможно?

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

SELECT * FROM SALES
WHERE CLIENTNUMBER IN ('123','456','789')

Есть ли способ создать переменную, которая будет содержать эти 3 значения, так что я могу вместо этого просто сказать

SELECT * FROM SALES
WHERE CLIENTNUMBER IN @CLOTHING_CLIENTS

Список длиннее, чем 3 номера клиента, конечно. И есть разные категории и т. Д. Я думаю, что было бы намного проще сделать это как отдельную таблицу, но, конечно, у меня нет возможности создавать новые таблицы. я мог бы сделать JOINи тому подобное, но это требует еще больше работы, чем просто вводить номера клиентов каждый раз.

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

2 ответа

Решение

Есть несколько способов сделать это с помощью временных таблиц или табличных переменных. Попробуйте что-то вроде этого:

declare @CLOTHING_CLIENTS table (ClientNumber varchar(20) not null);

-- Your list of values goes here
insert into @CLOTHING_CLIENTS (ClientNumber)
values ('123')
      ,('456')
      ,('789');

select * from Sales
where ClientNumber in (select ClientNumber from @CLOTHING_CLIENTS);

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

Хорошие новости, что есть глобальные вещи в T-SQL!!!

Расширение ответа Джеффа Льюиса, делающего вещи более "глобальными", заключается в использовании таблицы типа ##.

Предполагая, что вы можете сделать их, тогда ##Table является временной таблицей, к которой могут обращаться другие соединения и даже другие базы данных. Просто убедитесь, что вы на том же сервере.

Так что вы можете сделать это:

CREATE TABLE ##MyValues(A INT)
INSERT INTO ##MyValues(A) VALUES (1)

После этого вы можете пойти куда угодно и сделать

SELECT * FROM ##MyTables

Теперь все, что вам нужно сделать, это обновить ваши фрагменты, чтобы сделать такие вещи, как

SELECT * FROM SALES AS S
INNER JOIN ##MyClientIDTable AS MCIT OM MCIT.CLIENTNUMBER = S.CLIENTNUMBER

Просто убедитесь, что в вашем ##MyClientIDTable есть столбец CLIENTNUMBER и правильные данные.

Надеюсь это немного поможет.

Другие вопросы по тегам