首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果在满足条件之前对表进行验证,那么为什么表中的表不存在,从而导致错误?

问如果在满足条件之前对表进行验证,那么为什么表中的表不存在,从而导致错误?
EN

Stack Overflow用户
提问于 2020-04-07 21:37:54
回答 1查看 34关注 0票数 0

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

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

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

所以在这段代码中,假设参数是300。然后我收到上面的信息。您是否知道,如果有一种方法,将查询限制为不检查所有表,而只检查满足if条件的表?

代码语言:javascript
复制
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

我已经尝试过搜索它,但我发现大多数解决方案都是运行子过程,但我认为它并不是一个干净的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-08 07:51:51

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

"https://www.sqlservertutorial.net/sql-server-stored-procedures/sql-server-dynamic-sql/是一种编程技术,允许您在运行时动态地构造SQL语句。它允许您创建更通用和更灵活的SQL语句,因为编译时可能不知道SQL语句的全文。“

这就是查询现在的样子。因此,查询将根据参数动态更改,而不是多个IF语句。

代码语言:javascript
复制
    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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61089802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档