Создайте глобальный постоянный список строк как переменную
Я использую 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 и правильные данные.
Надеюсь это немного поможет.