我有一个存储过程(连接两个表并选择where @GID
),想要将表结果从行转换为列。我使用动态数据透视查询。
我的存储过程:
尝试使用pivot
后
我想要这样的结果:
GROUP_MOD_ID ADD EDIT DELETE ETC...
---------------------------------------
G02 1 1 0 ....
你能给我一些建议吗?
谢谢。
答案 0 :(得分:1)
这是因为您正在使用批处理分隔符来分隔查询。这意味着@GID的范围不正确。之后删除半结肠:
DECLARE @pivot_cols NVARCHAR(MAX);
在这种情况下,您不需要使用批处理分隔符。程序的逻辑流程意味着您可以毫无问题地省略它们。
编辑:
以下是我设计的编辑代码:
ALTER PROCEDURE GET_COLUMN_VALUE @GID CHAR(3)
AS
BEGIN
DECLARE @PivotCols NVARCHAR(MAX)
SELECT @PivotCols = STUFF((SELECT DISTINCT ' , ' + QUOTENAME(B.FUNCTION_MOD_NAME)
FROM FUNCTION_GROUP AS A
JOIN FUNCTION_MOD B
ON A.FUNCTION_MOD_ID = B.FUNCTION_MOD_ID
WHERE A.GROUP_MOD_ID = @GID
FOR XML PATH (' '), TYPE).value(' . ', 'NVARCHAR(MAX) '), 1, 1, ' ')
DECLARE @PivotQuery NVARCHAR(MAX)
SET @PivotQuery = '
;WITH CTE AS (
SELECT A.GROUP_MOD_ID, B.FUNCTION_MOD_NAME, CAST(ALLOW AS BIT) AS ALLOW
FROM FUNCTION_GROUP AS A
JOIN FUNCTION_MOD AS B
ON A.FUNCTION_MOD_ID = B.FUNCTION_MOD_ID)
SELECT GROUP_MOD_ID, '+@PivotCols+'
FROM CTE
PIVOT (MAX(ALLOW) FOR FUNCTION_MOD_NAME IN ('+@PivotCols')) AS PIV'
PRINT @PivotQuery
EXEC (@PivotQuery)
END
EDIT2:
您应该像这样执行此存储过程:
EXEC GET_COLUMN_VALUE @GID='G02'