执行存储过程数据集转动态列
时间: 2023-11-13 19:04:26 浏览: 40
可以使用以下存储过程将数据集转换为动态列:
```
CREATE PROCEDURE [dbo].[PivotData]
(
@pivotColumn NVARCHAR(MAX),
@aggregateColumn NVARCHAR(MAX),
@tableName NVARCHAR(MAX),
@dynamicColumns NVARCHAR(MAX) OUTPUT
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX);
SELECT @dynamicColumns = COALESCE(@dynamicColumns + ',', '') + QUOTENAME([pivotColumn])
FROM (SELECT DISTINCT [pivotColumn] FROM @tableName) t
ORDER BY [pivotColumn];
SET @sql = '
SELECT *
FROM (
SELECT [pivotColumn], [aggregateColumn]
FROM @tableName
) AS SourceTable
PIVOT (
MAX([aggregateColumn])
FOR [pivotColumn] IN (' + @dynamicColumns + ')
) AS PivotTable;
';
SET @sql = REPLACE(@sql, '@tableName', @tableName);
SET @sql = REPLACE(@sql, '[pivotColumn]', @pivotColumn);
SET @sql = REPLACE(@sql, '[aggregateColumn]', @aggregateColumn);
EXEC sp_executesql @sql;
END
```
这个存储过程接受四个参数:
- `@pivotColumn`:需要作为动态列的列名。
- `@aggregateColumn`:需要进行汇总的列名。
- `@tableName`:数据集的表名。
- `@dynamicColumns`:输出参数,包含动态列名的逗号分隔字符串。
例如,假设有以下数据集:
```
CREATE TABLE [dbo].[Example]
(
[ID] INT PRIMARY KEY,
[Category] NVARCHAR(50),
[Value] INT
);
INSERT INTO [dbo].[Example] ([ID], [Category], [Value])
VALUES (1, 'A', 10), (2, 'A', 20), (3, 'B', 30), (4, 'B', 40);
```
我们可以调用存储过程并将结果存储在临时表中:
```
DECLARE @dynamicColumns NVARCHAR(MAX);
EXEC [dbo].[PivotData]
@pivotColumn = 'Category',
@aggregateColumn = 'Value',
@tableName = '[dbo].[Example]',
@dynamicColumns = @dynamicColumns OUTPUT;
SELECT * INTO #TempTable FROM (
EXEC [dbo].[PivotData]
@pivotColumn = 'Category',
@aggregateColumn = 'Value',
@tableName = '[dbo].[Example]'
) AS PivotTable;
```
最终,我们将得到一个包含动态列的表:
```
SELECT * FROM #TempTable;
ID | A | B
----|-----|-----
1 | 10 | NULL
2 | 20 | NULL
3 | NULL| 30
4 | NULL| 40
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)