sql - 动态 TSQL 查询输出为 XML

标签 sql sql-server xml t-sql stored-procedures

我有一个运行良好的动态 TSQL 查询。然而,在我像这样动态化之前,我将它作为 XML 输出返回。

我现在如何对我的输出执行同样的操作?我需要 XML 格式的结果。

ALTER PROCEDURE [dbo].[empowermentFetchSubmissions2]
@category INT=NULL, @department INT=NULL, @startDate DATE=NULL, @endDate DATE=NULL, @empID VARCHAR (60)=NULL, @submissionID INT=NULL, @inVoting INT=NULL, @pastWinners INT=NULL
AS
DECLARE @sSQL AS NVARCHAR (3000), 
@Where AS NVARCHAR (1000) = ' (1=1) ';
BEGIN
    SET NOCOUNT ON;
    BEGIN
        SET @sSQL = 'SELECT  A.[submissionID],
                             A.[subEmpID],
                             A.[nomineeEmpID],
                             A.[nomineeDepartment],
                             CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate,
                             A.[situation],
                             A.[task],
                             A.[action],
                             A.[result],
                             A.[timestamp],
                             A.[statusID],
                             A.[approver],
                             A.[approvalDate],
                             B.[FirstName] + '' '' + B.[LastName] AS nomineeName,
                             B.[ntid] AS nomineeNTID,
                             B.[qid] AS nomineeQID,
                             C.[FirstName] + '' '' + C.[LastName] AS submitName,
                             C.[ntid] AS submitNTID,
                             D.[categoryName],
                             (SELECT CAST 
                             (CASE WHEN EXISTS (SELECT TOP (1) submissionID
                                    FROM   empowermentEntries
                                    WHERE  sessionID = (SELECT TOP (1) sessionID
                                                                            FROM   empowermentSessions
                                                                            WHERE  status = 1 
                                                                            AND CAST(GETDATE() as date) >= startDate 
                                                                            AND CAST(GETDATE() as date) <= endDate ) AND submissionID = A.[submissionID]) 
                                    THEN ''true''
                                    ELSE ''false''
                            END AS XML) AS inVoting)
                    FROM     empowermentSubmissions AS A
                             INNER JOIN
                             empTable AS B
                             ON A.[nomineeEmpID] = B.[empID]
                             INNER JOIN
                             empTable AS C
                             ON A.[subEmpID] = C.[empID]
                             INNER JOIN
                             empowermentCategories AS D
                             ON A.[categoryID] = D.[catID]';
        IF @category IS NOT NULL
            SET @Where = @Where + ' AND A.[categoryID] = @_category';
        IF @department IS NOT NULL
            SET @Where = @Where + ' AND A.[nomineeDepartment] = @_department';
        IF @startDate IS NOT NULL
            SET @Where = @Where + ' AND A.[submissionDate] >= @_startDate';
        IF @endDate IS NOT NULL
            SET @Where = @Where + ' AND A.[submissionDate] <= @_endDate';
        IF @empID IS NOT NULL
            SET @Where = @Where + ' AND A.[nomineeEmpID] = @_empID';
        IF @submissionID IS NOT NULL
            SET @Where = @Where + ' AND A.[submissionID] = @_submissionID';
        IF @inVoting IS NOT NULL
            SET @Where = @Where + ' AND A.[submissionID] IN (SELECT submissionID
                                                       FROM   empowermentEntries
                                                       WHERE  sessionID = (SELECT TOP (1) sessionID
                                                                            FROM   empowermentSessions
                                                                            WHERE  status = 1 
                                                                            AND CAST(GETDATE() as date) >= startDate 
                                                                            AND CAST(GETDATE() as date) <= endDate )
                                                              AND submissionID = A.[submissionID])';
        IF @pastWinners IS NOT NULL
            SET @Where = @Where + ' AND A.[submissionID] IN (SELECT E.[submissionID]
                                    FROM   empowermentEntries as E
                                    JOIN   empowermentWinners as F
                                    ON E.[entryID] = F.[entryID]
                                    WHERE  submissionID = A.[submissionID])';
        IF LEN(@Where) > 0
            SET @sSQL = @sSQL + ' WHERE ' + @Where;
        EXECUTE sp_executesql @sSQL, N'@_category INT, @_department INT, @_startDate DATE, @_endDate DATE, @_empID VARCHAR(60), @_submissionID INT, @_inVoting INT, @_pastWinners INT', @_category = @category, @_department = @department, @_startDate = @startDate, @_endDate = @endDate, @_empID = @empID, @_submissionID = @submissionID, @_inVoting = @inVoting, @_pastWinners = @pastWinners;
    END
END

最佳答案

您需要将现有的动态 SQL 添加 FOR XML...最后,将其括在括号中,并将该值设置为用作 sp_executesql 的输出的变量。 。例如:

DECLARE @SQL NVARCHAR(MAX),
        @Results XML;

SET @SQL = N'
SET @Out = (SELECT * FROM sys.objects FOR XML AUTO);
';

EXEC sp_executesql @SQL, N'@Out XML OUTPUT', @Out = @Results OUTPUT;
SELECT @Results;

因此在顶部声明一个新变量:

DECLARE @Results XML;

然后就在你的 EXECUTE sp_executesql @sSQL... 之前行,执行以下操作:

SET @sSQL = N'SET @Results = (' + @sSQL + N' FOR XML {xml options});';

然后将您的参数规范更新为 sp_executesql最后包括:

N'@_category INT, ..., @Results XML OUTPUT'

并将以下内容添加到 sp_executesql 的末尾:

@_category = @category, ..., @Out = @Results OUTPUT

关于sql - 动态 TSQL 查询输出为 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24810036/

相关文章:

mysql - MYSQL 对新索引数据的查询意外缓慢

sql-server - FireDAC SQL Server 连接 : Untrusted certificate

sql - 如何为组 SQL Server 分配一个 id

sql-server - 在 Windows 10 上安装 SQL Server 2017 开发人员版时出现 "Oops"错误

Android 在使用 cardview 图像时加载非常懒惰

c# - 序列化 List<T> 错误反射(reflect)字段

java - 如何在android中创建形状并在形状上添加文本和图像?

c# - LINQ to Entities 尝试投影两个表并将它们聚合

sql - 为什么 null||null 返回空值但 concat(null,null) 在 postgres 中返回空字符串?

c# - Windows 服务与简单程序