我目前正在研究資料發現和分類,我有一個查詢,可讓我在進行分類時查看資料預覽。
這是它如何對抗 AdventureWorks 的示例:
DECLARE @TableName VARCHAR(100) = 'Product'
DROP TABLE IF EXISTS #ColumnsToDisplay
SELECT ROW_NUMBER () OVER (ORDER BY tab.name) AS Iteration,
SCHEMA_NAME (tab.schema_id) AS schema_name,
tab.name AS table_name,
--col.column_id,
col.name AS column_name,
--t.name AS data_type,
--col.max_length,
--col.precision,
CAST(NULL AS VARCHAR(MAX)) AS DataSample
INTO #ColumnsToDisplay
FROM sys.tables AS tab
JOIN sys.columns AS col
ON col.object_id = tab.object_id
--LEFT JOIN sys.types AS t
-- ON col.user_type_id = t.user_type_id
WHERE tab.name = @TableName
DECLARE @Iterations INT = 0,
@CurrentIteration INT = 1;
SELECT @Iterations = MAX (Iteration)
FROM #ColumnsToDisplay
WHILE @CurrentIteration <= @Iterations
BEGIN
DECLARE @CurrentTableName VARCHAR(100) = '',
@CurrentColumnName VARCHAR(100) = '',
@DynamicQuery NVARCHAR(1000) = N''
DECLARE @Sample VARCHAR(MAX)
SET @CurrentTableName = '';
SET @DynamicQuery = N'';
SELECT @CurrentTableName = CONCAT (ttq.schema_name, '.', ttq.table_name),
@CurrentColumnName = ttq.column_name
FROM #ColumnsToDisplay AS ttq
WHERE ttq.Iteration = @CurrentIteration
IF (@CurrentTableName = '')
BEGIN
SET @CurrentIteration = 1
CONTINUE
END
SET @DynamicQuery = CONCAT (N'
SELECT @Sample = STRING_AGG(t.ColumnData,'', '')
FROM (
SELECT TOP 5 CAST(x.', @CurrentColumnName, ' AS VARCHAR(MAX)) AS ColumnData
FROM ', @CurrentTableName, ' AS x
WHERE x.', @CurrentColumnName, ' IS NOT NULL
)t')
EXECUTE sys.sp_executesql @DynamicQuery,
N'@Sample VARCHAR(MAX) OUTPUT',
@Sample = @Sample OUTPUT
UPDATE #ColumnsToDisplay
SET DataSample = @Sample
WHERE Iteration = @CurrentIteration
SET @CurrentIteration = 1
END
SELECT ctd.Iteration,
ctd.schema_name,
ctd.table_name,
--ctd.column_id,
ctd.column_name,
--ctd.data_type,
--ctd.max_length,
--ctd.precision,
ctd.DataSample
FROM #ColumnsToDisplay AS ctd
結果如下:
| 迭代 | 模式名稱 | 表名 | 列名 | 資料樣本 |
|---|---|---|---|---|
| 1 | 生產 | 產品 | 產品編號 | 980、365、771、404、977 |
| 2 | 生產 | 產品 | 姓名 | 可調式賽車、多用途自行車支架、AWC 標志帽、BB 滾珠軸承、軸承滾珠 |
| 3 | 生產 | 產品 | 產品編號 | AR-5381、BA-8327、BB-7421、BB-8107、BB-9108 |
| 4 | 生產 | 產品 | 制作標志 | 0, 0, 1, 0, 1 |
| 5 | 生產 | 產品 | 成品標志 | 0, 0, 0, 0, 0 |
| 6 | 生產 | 產品 | 顏色 | 黑色,黑色,黑色,銀色,銀色 |
問題是此查詢僅適用于 SQL Server 2017 及更高版本,因為它使用STRING_AGG. 對于 SQL Server 2016 及以下版本,我應該STUFF改用。
我遵循了這個例子,但我無法真正修復它。
我唯一知道的是,我需要移植的代碼部分是這樣的:
SET @DynamicQuery = CONCAT (N'
SELECT @Sample = STRING_AGG(t.ColumnData,'', '')
FROM (
SELECT TOP 5 CAST(x.', @CurrentColumnName, ' AS VARCHAR(MAX)) AS ColumnData
FROM ', @CurrentTableName, ' AS x
WHERE x.', @CurrentColumnName, ' IS NOT NULL
)t')
誰能幫助我埠STRING_AGG來STUFF?
謝謝
uj5u.com熱心網友回復:
首先,讓我們澄清一下stuff,正如 Stu 提到的,只是用于洗掉第一個分隔符。所以,如果你有
'a','b','c'
并且您想使用逗號分隔符,xml 路徑將為您提供:
,a,b,c
然后你用東西來切斷第一個逗號:
a,b,c
您的查詢似乎根本沒有分隔符,因此您不會使用stuff. 有了這個,這是我未經測驗的猜測,在它上面添加動態查詢是很棘手的:
SET @DynamicQuery = CONCAT (N'
set @Sample =
(
select t.ColumnData
from ', @CurrentTableName, ' AS x
where x.', @CurrentColumnName, ' IS NOT NULL
for xml path(''''), type
).value(''.'',''nvarchar(max)'')
)t')
uj5u.com熱心網友回復:
比你的幫助。
正確的問題是:
SET @DynamicQuery = CONCAT (N'
SELECT @Sample = STUFF((SELECT '', '' t.ColumnData
FROM (
SELECT TOP 5 CAST(x.[', @CurrentColumnName, '] AS VARCHAR(MAX)) AS ColumnData
FROM ', @CurrentTableName, ' AS x
WHERE x.[', @CurrentColumnName, '] IS NOT NULL
) AS t
FOR XML PATH('''')),1,1,'''')')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/362907.html
標籤:sql-server 查询语句 动态-sql for-xml-path 字符串聚合
上一篇:查詢每個商店的總金額
