Что .. Я объявляю @err_message, но потом тоже объявляю @err_message - PullRequest
0 голосов
/ 09 октября 2018

Я объявляю @err_message, но затем получаю объявление @err_message как:

ALTER PROCEDURE USP_FONM_16_FILES
    (@COMMAND NVARCHAR (MAX),
     @DBNAME NVARCHAR(MAX),
     @FORMAT_TABLE NVARCHAR (MAX))
AS 
BEGIN 
    IF @COMMAND = N'HOMEOWNER'
    BEGIN
        DECLARE @ERR_MESSAGE VARCHAR(MAX)=NULL
        DECLARE @SQL1 NVARCHAR (MAX)

        SET @SQL1 = N''+
    CONCAT('IF (SELECT MAX(DATA_TYPE) FROM  ', @FORMAT_TABLE ,')=', '''D''',' 
    BEGIN
        SELECT TOP 100* FROM ', @FORMAT_TABLE , '
    END
    ELSE
    BEGIN
            SET  @ERR_MESSAGE= ''NOT AVAILABLE''
            RAISERROR(@ERR_MESSAGE, 16, 1)
    END'
    )

END

Запустите процедуру - я получаю эту ошибку:

Сообщение 137, Уровень15, состояние 1, строка 51
Необходимо объявить скалярную переменную "@ERR_MESSAGE".

Сообщение 137, Уровень 15, Состояние 2, Строка 52

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Обновленный запрос - Попробуйте это

ALTER PROCEDURE USP_FONM_16_FILES
(
    @COMMAND NVARCHAR (MAX)         ,
    @DBNAME NVARCHAR(MAX)           ,
    @FORMAT_TABLE NVARCHAR (MAX)    
)
AS 
BEGIN 
IF @COMMAND =N'HOMEOWNER'

BEGIN

DECLARE @SQL1 NVARCHAR (MAX)

SET @SQL1=N''+
CONCAT('IF (SELECT MAX(DATA_TYPE) FROM  ', @FORMAT_TABLE ,')=', '''D''',' 
BEGIN
    SELECT TOP 100 * FROM ', @FORMAT_TABLE , '
END
ELSE
BEGIN
        DECLARE @ERR_MESSAGE VARCHAR(MAX)=NULL
        SET  @ERR_MESSAGE= ''NOT AVAILABLE''
        RAISERROR(@ERR_MESSAGE, 16, 1)
END'
)

END
sp_ExecuteSql @SQL1
END
0 голосов
/ 09 октября 2018

Я полностью согласен с @Zohar Peled.Кроме того, я бы предпочел отказаться от динамического SQL и попробовать другой подход, который подойдет вашему бизнесу.Если нет, то я бы сосредоточился на обработке ошибок, так как текущий метод, который вы обработали, даст вам головную боль в будущем.Представьте, что одна из этих таблиц была изменена, удалена или повреждена.Верите ли вы, что вы будете знать, какая таблица заполнила ошибку?Таким образом, вы можете расширить свое текущее решение за счет большей обработки ошибок или создать собственное решение по этому вопросу.

0 голосов
/ 09 октября 2018

Во-первых, тот факт, что вам нужно прибегнуть к динамическому SQL, потому что вам нужно выполнить один и тот же запрос к разным таблицам, автоматически пахнет как плохой дизайн базы данных.
Обычно это означает, что у вас несколько таблиц для одной и той же таблицы.и имена этих таблиц содержат часть, которая должна содержаться внутри столбца.

Например, такие таблицы, как Payments_2016, Payments_2017 и Payments_2018 - хотя должна быть только одна таблица с именемPayments со столбцом с именем Payement_Year.

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

Сказав это,Я знаю, что многие люди не могут изменить структуру базы данных, поэтому вот решение, которое следует использовать в случае, если вы реорганизуете базу данных:

Вы объявляете переменную @ERR_MESSAGE в хранимой процедуре, но вы пытаетесьиспользовать его внутри динамического SQL - и он работает в другой области видимости и поэтому не имеет доступа к @ERR_MESSAGE, объявленному вхранимая процедура.

Вы можете либо объявить ее внутри динамического SQL, либо передать ее sp_ExecuteSql с надлежащими определениями параметров.

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

Кроме того, у вас есть SELECT TOP 100*... - вам нужен пробел между 100 и * - SELECT TOP 100 * FROM ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...