Почему таблица внутри невыполненного IF проверяется до выполнения условия, что приводит к ошибке, если таблица не существует? - PullRequest
0 голосов
/ 08 апреля 2020

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

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

Сообщение 7314, уровень 16, состояние 1, строка 25 Поставщик OLE DB «Microsoft.ACE.OLEDB.16.0» для связанного сервера «LinkedServer» не содержит стол "Д100". Таблица либо не существует, либо текущий пользователь не имеет разрешений для этой таблицы.

Итак, в этом коде предположим, что параметр равен 300. Затем я получаю сообщение выше. Знаете ли вы, если есть способ ограничить запрос не проверкой всех таблиц, а только той, в которой будет выполнено условие IF?

ALTER PROCEDURE[dbo].[Import_data]
@p1 int = 0
AS
BEGIN
    SET NOCOUNT ON;

    IF(@p1 = 100)
    BEGIN
        DROP TABLE IF EXISTS Table1
        SELECT [Field1], [Field2], [Field3], [Field4], [Field5], [Field6]
        INTO Table1
        FROM[LinkedServer]...[D100]
    END

    IF(@p1 = 200)
    BEGIN
        DROP TABLE IF EXISTS Table2
        SELECT[Field1], [Field2], [Field3], [Field4], [Field5], [Field6]
        INTO Table2
        FROM[LinkedServer]...[D200]
    END

    IF(@p1 = 300)
    BEGIN
        DROP TABLE IF EXISTS Table3
        SELECT[Field1], [Field2], [Field3], [Field4], [Field5], [Field6]
        INTO Table3
        FROM[LinkedServer]...[D300]
    END
END

Я пытался его погуглить, но В основном я нашел обходные пути при выполнении подпроцедуры, но я думаю, что это не совсем чистое решение.

1 Ответ

0 голосов
/ 08 апреля 2020

Хорошо, кажется, я нашел ответ. Даже с оператором IF сервер SQL проверяет весь запрос перед его выполнением, поэтому способ его преодоления заключается в использовании Dynami c SQL Query.

"SQL Server Dynami c SQL - это метод программирования, который позволяет динамически создавать операторы SQL во время выполнения. Он позволяет создавать больше универсальный и гибкий оператор SQL, поскольку полный текст операторов SQL может быть неизвестен при компиляции. "

Так выглядит запрос сейчас. поэтому вместо нескольких операторов IF запрос изменяется динамически в зависимости от параметра.

    DECLARE @SQL NVARCHAR(MAX)
    SET @SQL = N'DROP TABLE IF EXISTS Table1; 
                SELECT [Field1]
                    ,[Field2]
                    ,[Field3]
                    ,[Field4]
                    ,[Field5]
                    ,[Field6]
                INTO Table1
            FROM [LinkedServer]...[D' + CONVERT(nvarchar(3),@p1) + N']'
    EXEC sp_executesql @SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...