生成另一个SQL查询的SQL查询

时间:2014-07-11 17:00:27

标签: sql sql-server database

我们的产品有两个部分,服务器应用程序和客户端应用程序。服务器应用程序使用SQL Server作为数据库引擎。客户端应用程序使用SQL Anywhere。服务器上的数据使用我们的专有复制方案复制到客户端。

我们最近在客户遇到了一个让我们头疼的问题。我们已经解决了该客户的问题,但我想生成一个工具,我们可以使用它来查找可能导致问题的“用户”表中的行。

我们在服务器应用程序的数据库中有许多表,用于跟踪需要复制到客户端的数据。这些表格是什么以及它们如何布局与这个问题无关。

我想在SQL Server中编写一个我们可以运行的查询,其输出是一个查询,技术支持人员可以将其复制到剪贴板并将其粘贴到客户端上的SQL Anywhere数据库查询工具的远程会话中。这并不难,问题是客户端中可能有多行需要检查。

我的查询看起来像这样:

SELECT 'SELECT Id, Name FROM MyClientTable WHERE <Condition to identify problem rows> AND Id = ''' + CONVERT( nvarchar(36), Id ) + '''' 
FROM MyServerTable
WHERE <Condition to identify problem row candidates>

这会为每个候选行生成一个查询。我想要一个看起来更像的查询:

SELECT Id, Name FROM MyClientTable WHERE <condition to identify problem rows> AND ID IN ( . . . )

有没有办法可以解决这个问题?如果是这样,我该怎么做?

2 个答案:

答案 0 :(得分:1)

这可能对您有用:

DECLARE @Tsql VARCHAR(MAX) 
SET @Tsql = 'SELECT Id, Name FROM MyClientTable WHERE <condition to identify problem rows> AND ID IN ('

SELECT @Tsql = @Tsql + CAST(ID AS VARCHAR) + ','
FROM MyServerTable
WHERE <Condition to identify problem row candidates>

--Remove last trailing comma, append closing parentheses.
SELECT @Tsql = LEFT(@Tsql, LEN(@Tsql) - 1) + ')'

PRINT @Tsql

编辑: tsql更改与旧版SQL Server的兼容性。

答案 1 :(得分:1)

您可以使用以下查询

;WITH Ids(IdValues)
AS
(
    SELECT '''' + CAST (Id AS VARCHAR(39)) + ''',' AS 'text()'   
    FROM MyServerTable WHERE <Condition to identify problem row candidates>
    FOR XML Path('')
)
SELECT 'SELECT Id, Name FROM MyClientTable WHERE <Condition to identify problem rows> AND Id IN (' + LEFT(IdValues,LEN(IdValues)-1) + ')' 
FROM Ids;