Sql server 测试动态查询,但不实际执行它

Sql server 测试动态查询,但不实际执行它,sql-server,tsql,Sql Server,Tsql,我有这个 DECLARE @Query VARCHAR(1000) = 'SELECT TOP(1) Field1,Field2,... FROM [ServerName].[DBName].[dbo].Table' 我想以这样一种方式测试上述查询,即它不应该返回任何结果,只是为了确保查询中的每个对象都存在于指定的server+db 我试过这个 BEGIN TRY EXEC(@Query); --My other stuff END TRY BEGIN CATCH PR

我有这个

DECLARE @Query VARCHAR(1000) = 'SELECT TOP(1) Field1,Field2,... FROM [ServerName].[DBName].[dbo].Table'
我想以这样一种方式测试上述查询,即它不应该返回任何结果,只是为了确保查询中的每个对象都存在于指定的
server+db

我试过这个

BEGIN TRY
    EXEC(@Query);
    --My other stuff
END TRY
BEGIN CATCH
    PRINT 'Skipping '
END CATCH
所以,如果执行查询,我想做
我的其他事情
,例如
[ServerName].[DBName].[dbo].[dbo]。表
不存在,它只打印
'Skipping'
。上面查询的问题是我不想要
EXEC(@query)为了得到实际执行,我想运行类似的东西,以确保查询实际执行时不会出现错误

我想我找到了解决办法 我会用


并用@CountNum

将@Query包装起来,您可以在动态查询中添加一个
where
子句,这样它就不会返回任何结果行。这样,查询将在现有表和字段上进行验证,但不会返回任何行

尝试1

select Id, Value
from MyTable
where 1 = 0;
错误:无效的对象名称“MyTable”

数据模型更新

create table MyTable
(
  Id int
);
alter table MyTable add Value nvarchar(10);

insert into MyTable (Id, Value) values (100, 'ABC');
尝试2

select Id, Value
from MyTable
where 1 = 0;
错误:列名“Value”无效

数据模型更新

create table MyTable
(
  Id int
);
alter table MyTable add Value nvarchar(10);

insert into MyTable (Id, Value) values (100, 'ABC');
尝试3次

select Id, Value
from MyTable
where 1 = 0;
不返回任何错误和数据行


您只是想检查目标服务器中是否存在该表。如果是这种情况,您仍然需要运行代码来查询该数据库。是的,我正在尝试检查该数据库中是否存在表和指定字段。字段和表名将始终更改,我只是不想去检查sys.table中是否存在这些内容。我建议从
@Query
中剥离列和表名,并使用动态SQL检查是否存在。这是我们唯一能查到的it@EricKlaus但是您的“方法”仍然会执行查询,并且在缺少表或列时(或者对于许多可能的tsql错误中的任何其他错误),仍然会生成错误。现在,您的方法将实际执行查询两次—一次确定它是否“有效”,然后再次以实际形式执行。听起来像一个大的。不,它只执行一次,如果有错误,它将转到Catch块而不执行任何操作,如果没有错误,它将在@CountNum中存储输出,而不显示它,并进一步转到“我的其他东西”。你认为哪里有问题?这样我就可以验证字段和表名是否存在。我知道你要去哪里,你说它将“仍然执行查询”,是的,它会,但我的问题是我不想显示该查询的任何输出,使用输出解决该问题,但它返回表结构至少,我想把它放在存储过程中,存储过程将返回大量不必要的表结构。我希望返回查询结果列标题的“开销”最小。没有解决方案将返回0字节,否则无法判断查询是否正确。