Создание операторов SQL для работы как с SSMS, так и с SSRS - PullRequest
1 голос
/ 06 августа 2010

Мне нужно задать этот вопрос на мгновение. Допустим, вы создали базу данных с именем 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.

Итак, каковы мои варианты? Я правильно об этом думаю?

Ответы [ 2 ]

1 голос
/ 28 апреля 2011

Я думаю, вы можете использовать ISNULL(,) для этого

0 голосов
/ 06 августа 2010

Почему бы не использовать таблицу varaible и использовать соединение вместо предложения in?

...