我得到了某人的幫助,可以在 sql 下撰寫,但完整的腳本不是我寫的。所以我有點困惑下面的sql是如何作業的?
CREATE Proc USP_GetValuationValue
(
@Ticker VARCHAR(10),
@ClientCode VARCHAR(10),
@GroupName VARCHAR(10)
)
AS
DECLARE @SPID VARCHAR(MAX), --Is this even used now?
@SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) NCHAR(10);
SELECT @SPID=CAST(@@SPID AS VARCHAR);
SET @SQL = N'SELECT * FROM (SELECT min(id) ID,f.ticker,f.ClientCode,f.GroupName,f.RecOrder,' STUFF((SELECT N',' @CRLF N' '
N'MAX(CASE FieldName WHEN ' QUOTENAME(FieldName,'''') N' THEN FieldValue END) AS ' QUOTENAME(FieldName)
FROM tblValuationSubGroup g
WHERE ticker=@Ticker AND ClientCode=@ClientCode AND GroupName=@GroupName
GROUP BY FieldName
ORDER BY MIN(FieldOrder)
FOR XML PATH(''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,10,N'') @CRLF
N'FROM (select * from tblValuationFieldValue' @CRLF
N'WHERE Ticker = @Ticker AND ClientCode = @ClientCode AND GroupName= @GroupName) f' @CRLF
N'GROUP BY f.ticker,f.ClientCode,f.GroupName,f.RecOrder) X' @CRLF
N'ORDER BY Broker;';
PRINT @SQL;
下面的sql是執行上面的動態sql后生成的
SELECT * FROM (SELECT min(id) ID,f.ticker,f.ClientCode,f.GroupName,f.RecOrder,
MAX(CASE FieldName WHEN 'Last Update' THEN FieldValue END) AS [Last Update],
MAX(CASE FieldName WHEN 'Broker' THEN FieldValue END) AS [Broker],
MAX(CASE FieldName WHEN 'Rating' THEN FieldValue END) AS [Rating],
MAX(CASE FieldName WHEN 'Equivalent Rating' THEN FieldValue END) AS [Equivalent Rating],
MAX(CASE FieldName WHEN 'Target Price' THEN FieldValue END) AS [Target Price]
FROM (select * from tblValuationFieldValue
WHERE Ticker = @Ticker AND ClientCode = @ClientCode AND GroupName= @GroupName) f
GROUP BY f.ticker,f.ClientCode,f.GroupName,f.RecOrder) X
ORDER BY Broker;
這部分不清楚為什么在上面的sql中使用? FOR XML PATH(''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,10,N'')
為什么這里使用了FOR XML PATH()?我總是使用FOR XML PATH()從表中生成帶有資料的 xml。
請幫助我了解第一個動態 sql,比如它是如何作業的。
謝謝
uj5u.com熱心網友回復:
FOR XML PATH('')在舊版本的 SQL Server(2017 年之前)中用于將多行中的值合二為一。由于您正在設定一個變數,@SQL因此您正在設定一個字串,因此需要回傳一行。
FOR XML PATH('')生成表中MAX(CASE FieldName [...]的所有資料tblValuationSubGroup。中的每一行tblValuationSubGroup包含一個欄位。FOR XML PATH('')將行添加到一個字串中,稍后在執行期間將其轉換為欄位。
自 SQL Server 2017 以來,該函式
在舊版本的 SQL Server 中解決的問題FOR XML PATH('')已得到解決。 https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?視圖=sql-server-ver16STRING_AGG()
uj5u.com熱心網友回復:
FOR XML PATH 正在MAX(CASE FieldName WHEN '...' THEN FieldValue END) AS [...]使用.FieldNametblValuationSubGroup
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/492723.html
