为什么在满足条件之前要验证不满足IF中的表,而在表不存在的情况下会导致错误



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

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

消息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

我试过在谷歌上搜索它,但我发现大多数变通方法都是运行子过程,但我认为这并不是一个真正干净的解决方案。

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

"SQL Server动态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

最新更新