Хранимая процедура с локальными и входными переменными

Я пытаюсь создать процедуру, в которой я могу указать 2 входные переменные и иметь ряд переменных локальной процедуры, которые будут возвращать таблицу результатов SQL-запроса.

Это код, который я написал для этого.

CREATE PROCEDURE sp_MS_Field_Mapping( 
    @MS_Table_Name VARCHAR(100), 
    @DCW_No VARCHAR(10)
)
AS

SET NOCOUNT ON;


DECLARE @Rsrc_Mapping varchar(100);
DECLARE @Appt_Types_Rsrc varchar(100);
DECLARE @Appt_Type_Settings varchar(100);

SET @Rsrc_Mapping = 'REF_'+@DCW_No+'_Rsrc_Mapping'
SET @Appt_Types_Rsrc = 'REF_'+@DCW_No+'_Appt_Types_Rsrc'
SET @Appt_Type_Settings = 'REF_'+@DCW_No+'_Appt_Type_Settings'

PRINT @Rsrc_Mapping
PRINT @Appt_Types_Rsrc
PRINT @Appt_Type_Settings

SELECT mst.Main_Bookshelf_Old
    ,mst.Main_Bookshelf_New
    ,mst.Main_Bookshelf_New_Mirror
    ,mst.Scndry_Bookshelf_Old
    ,mst.Scndry_Bookshelf_New
    ,mst.Scndry_Bookshelf_New_Mirror
    ,mst.Book_Name_Old
    ,mst.Book_Name_New
    ,mst.Book_Name_New_Mirror
    ,mst.Scndry_Book_Name_Old
    ,mst.Scndry_Book_Name_New
    ,mst.Scndry_Book_Name_New_Mirror
    ,mst.Tertiary_Book_Old
    ,mst.Tertiary_Book_New
    ,mst.Amb_Loc_Old
    ,mst.Amb_Loc_New
    ,mst.Rsrc_Old
    ,mst.Rsrc_New
    ,mst.Rsrc_New_Mirror
    ,eus.Clinic_Type
    ,mst.Protocol_Old
    ,mst.Protocol_New
    ,mst.Appt_Type_Old
    ,mst.Appt_Type_New
    ,cmn.Accept_Format_Name
    ,atr.Slot_Name
    ,NULL AS Orders
    ,rm.Service_Provider_Type
    ,mst.Multi_Rsrc_Clin
    ,mst.Known_Addit_Providers
    ,mst.Wait_list_Old
    ,ats.RL_Queue AS Wait_List_New
    ,cmn.MO_Tier2_Code
    ,cmn.MO_Tier2_Name
    ,cmn.OHP_Tier2_Code
    ,cmn.OHP_Tier2_Name
    ,cmn.CCC
    ,cmn.CCC_Name
    ,cmn.Delivery_Method
    ,cmn.Patient_Visit_Type
    ,cmn.Session_Type
    ,cmn.Care_Type
    ,eus.Delivery_Setting
    ,cmn.Appt_Class
    ,cmn.OOS_Inc
FROM @MS_Table_Name mst
INNER JOIN dbo.REF_DCW_CMN_Appt_Setting_Map cmn
    ON mst.Appt_Type_New = cmn.Appt_Type_Name
LEFT JOIN @Rsrc_Mapping rm
    ON mst.Rsrc_New = rm.Rsrc_Mnemonic
INNER JOIN @Appt_Types_Rsrc atr
    ON mst.Appt_Type_New = atr.Appt_Type_Name
        AND mst.Amb_Loc_New = atr.Amb_Loc
        AND mst.Rsrc_New = atr.Rsrc_Available
INNER JOIN dbo.REF_EUS_Appt_Info eus
    ON mst.Appt_Type_Old = eus.Appt_Type
LEFT JOIN @Appt_Type_Settings ats
    ON mst.Appt_Type_New = ats.Appt_Type_Name
        AND mst.Amb_Loc_New = ats.Amb_Loc
RETURN
GO

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

Сообщение 1087, уровень 16, состояние 1, процедура sp_MS_Field_Mapping, строка 73
Необходимо объявить переменную таблицы "@MS_Table_Name".

Сообщение 1087, уровень 16, состояние 1, процедура sp_MS_Field_Mapping, строка 76
Необходимо объявить табличную переменную "@Rsrc_Mapping".

Сообщение 1087, уровень 16, состояние 1, процедура sp_MS_Field_Mapping, строка 78
Необходимо объявить переменную таблицы "@Appt_Types_Rsrc".

Сообщение 1087, уровень 16, состояние 1, процедура sp_MS_Field_Mapping, строка 84
Необходимо объявить табличную переменную "@Appt_Type_Settings".

Кто-нибудь может помочь?

Заранее спасибо.


person Lucas Perrett    schedule 20.01.2015    source источник
comment
Вы не можете использовать переменную для имен таблиц и имен столбцов. Вместо этого вы должны использовать динамический SQL. Однако помните о последствиях. Подробнее об этом читайте на странице sommarskog.se/dynamic_sql.html.   -  person Felix Pamittan    schedule 20.01.2015
comment
Я не использую его только для имен таблиц, потому что они соответствуют стандарту именования, и я не хочу вводить 5 имен таблиц каждый раз, когда я хочу его запустить.   -  person Lucas Perrett    schedule 20.01.2015


Ответы (1)


Вам нужно использовать динамический SQL для выполнения с именем таблицы в переменной. Используйте приведенный ниже код

CREATE PROCEDURE sp_MS_Field_Mapping( 
@MS_Table_Name VARCHAR(100), 
@DCW_No VARCHAR(10)
)
AS

SET NOCOUNT ON;


DECLARE @Rsrc_Mapping varchar(100);
DECLARE @Appt_Types_Rsrc varchar(100);
DECLARE @Appt_Type_Settings varchar(100);

SET @Rsrc_Mapping = 'REF_'+@DCW_No+'_Rsrc_Mapping'
SET @Appt_Types_Rsrc = 'REF_'+@DCW_No+'_Appt_Types_Rsrc'
SET @Appt_Type_Settings = 'REF_'+@DCW_No+'_Appt_Type_Settings'

PRINT @Rsrc_Mapping
PRINT @Appt_Types_Rsrc
PRINT @Appt_Type_Settings

DECLARE @QRY NVARCHAR(MAX)

SET @QRY ='

SELECT mst.Main_Bookshelf_Old
    ,mst.Main_Bookshelf_New
    ,mst.Main_Bookshelf_New_Mirror
    ,mst.Scndry_Bookshelf_Old
    ,mst.Scndry_Bookshelf_New
    ,mst.Scndry_Bookshelf_New_Mirror
    ,mst.Book_Name_Old
    ,mst.Book_Name_New
    ,mst.Book_Name_New_Mirror
    ,mst.Scndry_Book_Name_Old
    ,mst.Scndry_Book_Name_New
    ,mst.Scndry_Book_Name_New_Mirror
    ,mst.Tertiary_Book_Old
    ,mst.Tertiary_Book_New
    ,mst.Amb_Loc_Old
    ,mst.Amb_Loc_New
    ,mst.Rsrc_Old
    ,mst.Rsrc_New
    ,mst.Rsrc_New_Mirror
    ,eus.Clinic_Type
    ,mst.Protocol_Old
    ,mst.Protocol_New
    ,mst.Appt_Type_Old
    ,mst.Appt_Type_New
    ,cmn.Accept_Format_Name
    ,atr.Slot_Name
    ,NULL AS Orders
    ,rm.Service_Provider_Type
    ,mst.Multi_Rsrc_Clin
    ,mst.Known_Addit_Providers
    ,mst.Wait_list_Old
    ,ats.RL_Queue AS Wait_List_New
    ,cmn.MO_Tier2_Code
    ,cmn.MO_Tier2_Name
    ,cmn.OHP_Tier2_Code
    ,cmn.OHP_Tier2_Name
    ,cmn.CCC
    ,cmn.CCC_Name
    ,cmn.Delivery_Method
    ,cmn.Patient_Visit_Type
    ,cmn.Session_Type
    ,cmn.Care_Type
    ,eus.Delivery_Setting
    ,cmn.Appt_Class
    ,cmn.OOS_Inc
FROM '+@MS_Table_Name+' mst
INNER JOIN dbo.REF_DCW_CMN_Appt_Setting_Map cmn
    ON mst.Appt_Type_New = cmn.Appt_Type_Name
LEFT JOIN '+@Rsrc_Mapping+' rm
    ON mst.Rsrc_New = rm.Rsrc_Mnemonic
INNER JOIN '+@Appt_Types_Rsrc+' atr
    ON mst.Appt_Type_New = atr.Appt_Type_Name
        AND mst.Amb_Loc_New = atr.Amb_Loc
        AND mst.Rsrc_New = atr.Rsrc_Available
INNER JOIN dbo.REF_EUS_Appt_Info eus
    ON mst.Appt_Type_Old = eus.Appt_Type
LEFT JOIN '+@Appt_Type_Settings+' ats
    ON mst.Appt_Type_New = ats.Appt_Type_Name
        AND mst.Amb_Loc_New = ats.Amb_Loc
        '
EXEC SP_EXECUTESQL @QRY     

RETURN
GO
person Sarath KS    schedule 20.01.2015
comment
К. Если верно, отметьте как ответ @Lucas Perrett - person Sarath KS; 20.01.2015
comment
@LucasPerrett - Если этот ответ решил вашу проблему, отметьте его как ответ, установив галочку слева от этого ответа. - person Pரதீப்; 20.01.2015