比较一堆SQL语句和审核结果的结果

时间:2017-02-06 14:44:29

标签: sql-server

我有一个包含2列的SQL Server表。第1列是Query_Name,第2列是Query_Text。此query_text列包含一个半简单的SQL Select语句。我这样有34行。这些Select语句不一定在同一SQL服务器上运行。我想要一种方法,我可以运行这34个查询,比较它们的结果,并在某些条件适用时通过电子邮件通知用户。电子邮件部分,我知道了。它是SQL Server代理任务。但我很遗憾如何运行这34个查询并进行比较。

这必须是动态的。例如,具有34个变量的存储过程不起作用。这个34明天可能是40岁。我想每晚运行query_text列中包含的查询并比较它们并通过电子邮件发送给用户。

有什么想法吗?

编辑1:

比较部分:它不能有显着差异。有什么不同之处取决于我的老板。为了这个问题,我们假设它的变化不能超过100.这34个查询的输出是数字(它们的数据类型可能是nvarchar,但输出肯定是数字)。

编辑2:

运行1查询,然后运行给定列中的所有查询。

DECLARE @QUERYCOLUMN nvarchar(50)
SET @QUERYCOLUMN = (SELECT QUERY_TEXT FROM TABLE_NAME)
EXEC(@QUERYCOLUMN)

那种方式。

2 个答案:

答案 0 :(得分:0)

这将您的查询转储到表变量中,并循环执行文本然后从表变量中删除它。在采用这种方法或任何其他方法之前,你应该明确地意识到执行动态SQL的危险。

DECLARE @Name VARCHAR(50), @Query VARCHAR(MAX)

DECLARE @Queries TABLE (Query_Name VARCHAR(50), Query_Text VARCHAR(MAX))

INSERT INTO @Queries(Query_Name, Query_Text)
SELECT Query_Name, Query_Text FROM MY_SOURCE_TABLE

WHILE EXISTS (SELECT 1 FROM @Queries)
BEGIN
SELECT TOP 1 @Name = Query_Name, @Query = Query_Text FROM @Queries
EXEC(@Query)
DELETE FROM @Queries WHERE Query_Name = @Name
END

此方法假定Query_Name在源数据中是唯一的,否则结果可能会偏斜。

答案 1 :(得分:0)

这将允许您遍历表并执行每个条目中包含的语句。

如果你希望将它输出到一个表中,你需要改变@sSQL中包含的语句,但这适用于在SSMS中测试。

我建议你使用简单的排序增量ID(身份是最简单的),以便确定所有条目的计算时间。

DECLARE @QID INT, @sSQL NVARCHAR(MAX) = ''

SELECT @QID = MIN(QID) FROM [dbo].[QueryComparison]
WHILE @QID IS NOT NULL
BEGIN
SELECT @sSQL = Query_Text FROM [dbo].[QueryComparison] WHERE QID = @QID
EXEC sp_executesql @sSQL

SELECT @QID = MIN(QID) FROM [dbo].[QueryComparison] WHERE QID > @QID

END