为什么在满足条件之前验证未满足的 IF 中的 table,如果 table 不存在则导致错误?

Why is the table inside a non-met IF being validated before condition is met, resulting in error if table does not exist?

我正在尝试执行带有参数的过程,根据参数的值,将评估三个不同的 IF 条件以验证它将从链接服务器执行哪个查询。

但是当我执行查询时,它似乎在开始查询之前检查所有 IF 中的 tables 是否存在。而且我知道 table 中只有一个存在,这就是我使用参数的原因,所以它不应该失败。但无论如何我都会收到以下错误:

Msg 7314, Level 16, State 1, Line 25 The OLE DB provider "Microsoft.ACE.OLEDB.16.0" for linked server "LinkedServer" does not contain the table "D100". The table either does not exist or the current user does not have permissions on that table.

所以在这段代码中,假设参数是300。然后我得到上面的信息。 你知道吗,如果有办法限制查询不检查所有 table,而只检查满足 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

我试过用谷歌搜索它,但我发现大部分变通方法是 运行 一个子程序,但我认为它并不是一个真正干净的解决方案。

好的,看来我找到了答案。即使使用 IF 语句,SQL 服务器也会在执行之前验证整个查询,因此克服它的方法是使用动态 SQL 查询。

"SQL Server Dynamic 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