为什么在不满足条件之前验证非满足IF内的表,如果表不存在会导致错误?

时间:2020-04-07 21:37:54

标签: sql-server linked-server

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

但是当我执行查询时,它似乎在开始查询之前检查所有IF内部的表是否存在。而且我知道只有一个表存在,这就是为什么我使用参数,所以它不会失败。但无论如何,我得到以下错误:

Msg 7314,第16级,状态1,第25行 链接服务器“ LinkedServer”的OLE DB提供程序“ Microsoft.ACE.OLEDB.16.0”不包含表“ D100”。该表不存在,或者当前用户对该表没有权限。

因此在此代码中,假设参数为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 :(得分:0)

好吧,看来我找到了答案。即使使用IF语句,SQL Server也会在执行之前验证整个查询,因此克服此问题的方法是使用动态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