我们的产品有两个部分,服务器应用程序和客户端应用程序。服务器应用程序使用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 ( . . . )
有没有办法可以解决这个问题?如果是这样,我该怎么做?
答案 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;