验证T-SQL查询的方法?
我可以访问access数据库,该数据库中的字段填充了TSQL查询。这些查询由服务器上的T-SQL处理。因此,当我编写这些SQL查询并将它们放入一个字段供终端服务器使用时,我无法验证语法等。我可以在Access数据库中创建一个临时查询,但它不是相同的查询语言。例如,Access将正确使用验证T-SQL查询的方法?,sql,sql-server,tsql,syntax,Sql,Sql Server,Tsql,Syntax,我可以访问access数据库,该数据库中的字段填充了TSQL查询。这些查询由服务器上的T-SQL处理。因此,当我编写这些SQL查询并将它们放入一个字段供终端服务器使用时,我无法验证语法等。我可以在Access数据库中创建一个临时查询,但它不是相同的查询语言。例如,Access将正确使用IIF,但TSQL不会(它将改为CASE) 我没有使用TSQL直接访问此服务器的权限,是否有一种方法可以验证我的t-SQL查询(针对语法等)?也许是网络工具在线 我应该注意,我没有访问SQL server的权限。只
IIF
,但TSQL不会(它将改为CASE
)
我没有使用TSQL直接访问此服务器的权限,是否有一种方法可以验证我的t-SQL查询(针对语法等)?也许是网络工具在线
我应该注意,我没有访问SQL server的权限。只有Access db和该数据库。我知道它不会验证表名等,我不希望它会验证。SQL Server Management Studio Express(免费下载)是否能够连接到常规SQL Server实例?如果是这样,也许您可以在那里测试查询。即使无法连接到实际服务器,您可以在Express中创建数据库的测试版本,该版本至少允许您捕获语法和命名问题。您可以通过在SQL Server计算机上执行T-SQL,并将
设置为PARSEONLY on
作为脚本的第一行,来解析T-SQL以检查有效语法。它不会验证表名或字段名,但会向您提供任何语法错误。Data Dude(Gert Drapers)在此处介绍了如何在应用程序中使用内置SQL Server T-SQL解析器:
这是一种基于.NET的方法,当然,如果您不使用实时数据库,它无法验证数据库中的对象名称,但它可以捕获T-SQL语句中的语法错误。实际上,MattMc3的答案和FremenFreedom的答案相结合应该是可行的 下载SQLExpress 然后,声明以下存储过程:
create procedure IsValidSQL (@sql varchar(max)) as
begin
begin try
set @sql = 'set parseonly on;'+@sql;
exec(@sql);
end try
begin catch
return(1);
end catch;
return(0);
end; -- IsValidSQL
您可以使用以下工具进行测试:
declare @retval int;
exec @retval = IsValidSQL 'select iif(val, 0, 1) from t';
select @retval
或与:
declare @retval int;
exec @retval = IsValidSQL 'select val from t';
select @retval
注意:这将捕获IIF()问题。它不会捕获任何与表结构或列结构相关的内容。为此,您需要一个模式,并且需要一个稍微不同的方法(“selecttop0*from()t”)来完成
您可能可以使用SQLFiddle在线执行某些操作。但是,我建议使用数据库的本地副本。如果它们是相当静态的,请将它们转换为Sql数据库中的存储过程,然后从access调用它们。您可以使用:
这将很困难,尤其是当您验证特定于SQL Server中对象的查询时。这是正确的,尽管问题中没有明确列出无法连接到SQL Server数据库的限制。由于缺少表/列验证,没有什么可以阻止与SQL Express安装的连接。不必是生产数据库。我没有访问SQL Server计算机的权限。Access是我可以触摸的唯一应用程序(通过Citrix)。出于我的需要,
SET-NOEXEC ON
远远优于SET-PARSEONLY ON
,因为此选项还可以根据架构验证查询。
SET NOEXEC ON
SELECT 1 AS Test
SET NOEXEC OFF