Мне нужно задать этот вопрос на мгновение. Допустим, вы создали базу данных с именем ParameterTesting, создали таблицу и заполнили ее следующим образом:
IF EXISTS
(SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'StarWars'
AND TABLE_SCHEMA = 'dbo')
BEGIN
DROP TABLE dbo.StarWars
PRINT 'Dropped StarWars'
END
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE TABLE [dbo].[StarWars]
(
[IdentityColumn] INT IDENTITY (1, 1) NOT NULL
,[MasterDate] DATETIME NULL
,[ForcePowerRating] INT NULL
,[Name] VARCHAR(25) NULL
,[Status] VARCHAR(25) NULL
)
ON [PRIMARY];
GO
INSERT INTO StarWars(
MasterDate
,ForcePowerRating
,[Name]
,[Status])
VALUES (
'5/21/1980'
,500
,'Luke Skywalker'
,'Master')
INSERT INTO StarWars(
MasterDate
,ForcePowerRating
,[Name]
,[STATUS])
VALUES (
'1/1/1910'
,1000
,'Yoda'
,'Jedi Council')
INSERT INTO StarWars(
MasterDate
,ForcePowerRating
,[Name]
,[STATUS])
VALUES (
'1/1/1930'
,NULL
,'Obi-Wan Kenobi'
,'Master')
INSERT INTO StarWars(
MasterDate
,ForcePowerRating
,[Name]
,[STATUS])
VALUES (
'1/1/1920'
,300
,NULL
,NULL)
INSERT INTO StarWars(
MasterDate
,ForcePowerRating
,[Name]
,[STATUS])
VALUES (
NULL
,450
,'Anakin Skywalker'
,'Sith Apprentice')
В этом примере я пытаюсь создать многозначный параметр для Status, но это сложно, поскольку столбец Status может быть пустым. Если бы мне не пришлось беспокоиться о пустых значениях, я мог бы просто установить доступные значения и значения по умолчанию из того же запроса, и этот параметр стал необязательным.
На мой взгляд, правильный способ построения этого запроса в SSMS или аналогичном инструменте:
DECLARE @Status AS VARCHAR(20)
SET @status = 'Master'
SELECT [Name]
,ForcePowerRating
,MasterDate
,Status
FROM StarWars
WHERE
(status in (@Status) or (status is null and '..None' in (@Status)))
Я бы заполнил набор данных доступными значениями и значениями по умолчанию:
select distinct coalesce(status, '..None') JediStatus from StarWars
Я использую оператор IN, чтобы он мог поддерживать несколько значений. Мой запрос набора данных параметров заменяет «..None» на пустые значения, а предложение WHERE этого оператора обрабатывает нулевые значения. Если вы этого не сделаете, ваш параметр не будет использоваться по умолчанию для всего списка в SSRS, так как несколько значений параметров не могут поддерживать нули в SSRS.
По сути, моя проблема заключается в следующем. Как я могу использовать свой запрос для заполнения переменной t-sql при работе с ней в SSMS или другом инструменте?
Я хочу иметь возможность запускать свои запросы (включая запрос списка параметров) в SSMS для проверки моей работы. Вместо:
Set @Status = ‘Master’
Я хочу сделать что-то вроде:
Set @Status = select distinct coalesce(status, '..None') JediStatus from StarWars
Это не сработает, и использование табличной переменной тоже не будет, потому что вы не можете использовать IN с табличной переменной. Я пытался использовать SP для создания цепочки символов (из запроса), таких как «Мастер», «Совет джедаев», «Нет» ……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………… 10…
Это очень сложно, потому что я должен поддерживать SQL 2000 и не могу использовать Common Table Expressions.
Итак, каковы мои варианты? Я правильно об этом думаю?