Как установить объявленный параметр через несколько запросов выбора - PullRequest
0 голосов
/ 09 января 2019

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

Я получаю сообщение об ошибке "Должен объявить скалярную переменную" @REGION ", и я затрудняюсь с тем, как решить эту проблему с помощью того, что я исследовал. Кроме того, я предполагаю, что код может быть более оптимизирован, однако выходит за рамки моих технических возможностей, а также за человека, который выполняет эту способность кодов.

USE ADMIN;
DECLARE @REGION NVARCHAR(255)
SET @REGION = 'Region 20 - Midwest';

SELECT [Account Code Description]
    ,[Level 3 Organization Name]
    ,COUNT([Code - Fix Comp]) AS WO_VOL_52
    ,CAST((CAST(SUM([Code - Fix Comp]) AS FLOAT)/CAST(COUNT([Code - Fix Comp]) AS FLOAT))  AS DECIMAL(18,3)) AS OTC_52
    ,CAST((CAST(SUM([Code - Manager Comp]) AS FLOAT)/CAST(COUNT([Code - Manager Comp]) AS FLOAT))  AS DECIMAL(18,3)) AS MR_52
    ,CAST((CAST(SUM([Code - Disagree Comp]) AS FLOAT)/CAST(COUNT([Code - Disagree Comp]) AS FLOAT))  AS DECIMAL(18,3)) AS SAT_52
    ,CAST((CAST(SUM([Code - Recall]) AS FLOAT)/CAST(COUNT([Code - Recall]) AS FLOAT))  AS DECIMAL(18,3)) AS RECALL_52

FROM [dbo].[Manager Review Data]

WHERE [52WK] LIKE 'YES'
    AND [Account Code Description] NOT IN ('Insurance','RECURRING SERVICES')
    AND [Level 3 Organization Name] = @REGION

GROUP BY [Account Code Description],[Level 3 Organization Name]

Я ожидаю, что когда параметр задан, использование @Region вызовет этот параметр во всех запросах, для которых используется переменная.

1 Ответ

0 голосов
/ 10 января 2019

Обычно я использую таблицу метаданных для этого типа функциональности. Пример кода ниже дает вам прототип для таблицы метаданных. Пользователь будет выполнять процедуру [utility]. [Set__metadata], чтобы установить значение, а затем все ваши скрипты будут вызывать встроенную функцию для получения значения. С другой стороны, вы могли бы «установить» множество значений метаданных и просто иметь одну переменную для установки в верхней части каждого сценария, чтобы пользователь мог ввести то, что искали.

Дайте мне знать, если у вас есть вопросы. Вы обнаружите, что это очень полезная конструкция, позволяющая избежать жестких констант кодирования в вашем коде (для которых требуется перестроение / повторное развертывание кода), легко изменять значения, где бы они ни встречались в вашем коде, и давать простые, легкие запомнить имена для этих значений. Я обычно использую "category.class.type". Вы, вероятно, должны использовать некоторые стандартизированные соглашения об именах. Я избегаю прописных букв из-за возможной ошибки в регистре (компоненты .NET избирательно учитывают регистр) Но используйте соглашение об именах, которое имеет смысл для вас.

Вы можете также решить добавить представление или функцию «список», чтобы вы или другое лицо могли легко увидеть все доступные значения метаданных.

use [test];

go

if schema_id(N'utility') is null
  execute (N'create schema utility');

go

if object_id(N'[utility].[metadata]', N'U') is not null
  drop table [utility].[metadata];

go

create table [utility].[metadata]
  (
     [key]     [nvarchar](256)
     , [value] [nvarchar](256)
  );

go

if object_id(N'[utility].[set__metadata]', N'P') is not null
  drop procedure [utility].[set__metadata];

go

create procedure [utility].[set__metadata] @key     [nvarchar](256)
                                           , @value [nvarchar](256)
as
  begin
      merge into [utility].[metadata] as [target]
      using (values(@key
            , @value)) as [source] ([key], [value])
      on [source].[key] = [target].[key]
      when not matched then
        insert ([key]
                , [value])
        values ([key]
                , [value])
      when matched then
        update set [target].[key] = [source].[key];
  end;

go

if object_id(N'[utility].[get__metadata]', N'FN') is not null
  drop function [utility].[get__metadata];

go

create function [utility].[get__metadata] (@key [nvarchar](450))
returns [nvarchar](256)
as
  begin
      declare @value [nvarchar](max)

      select @value = [value]
      from   [utility].[metadata]
      where  [key] = @key;

      return @value;
  end;

GO

execute [utility].[set__metadata]
  @key = N'region.southwest.texas'
  , @value=N'hot and humid';

go

execute [utility].[set__metadata]
  @key = N'region.pacific_northwest.seattle'
  , @value=N'cold and rainy';

go

select [utility].[get__metadata](N'region.southwest.texas');

go 

select [utility].[get__metadata](N'region.pacific_northwest.seattle');

go
...