Sql server 从透视结果创建表变量
是否可以从透视结果创建表变量 我的透视查询:Sql server 从透视结果创建表变量,sql-server,tsql,Sql Server,Tsql,是否可以从透视结果创建表变量 我的透视查询: SELECT @QUERY = 'SELECT USER_KEY, ' + @COLDEPSUMMARY + ' FROM CAUSDE_TAS PIVOT ( SUM(USDE_HSU) FOR DEPA_KEY IN (' + @COLDEPARTMENT
SELECT @QUERY = 'SELECT USER_KEY, ' + @COLDEPSUMMARY + '
FROM CAUSDE_TAS
PIVOT
(
SUM(USDE_HSU)
FOR DEPA_KEY IN (' + @COLDEPARTMENTS + ')
) PIVOT_LOCATIONS
WHERE USDE_DAT >= ''' + format(@dDateFrom, 'MM.dd.yyyy') + ''' AND USDE_DAT <= ''' + format(@dDateTo, 'MM.dd.yyyy') + '''
AND USER_KEY IN (' + @USERS_STR + ')
GROUP BY USER_KEY'
@各部门:
[120000003],[120000002],[140000001],[120000005], ...
我想从pivot表创建表变量的主要原因是pivot中的列数是动态的——它可以变化,并且在70左右有很多列
更新
正如Jeremy所建议的,我已经在动态查询中将其包含在tmp中,所以它看起来是这样的:
SELECT @QUERY = 'SELECT USER_KEY, ' + @COLDEPSUMMARY + '
INTO #tmp
FROM CAUSDE_TAS
PIVOT
(
SUM(USDE_HSU)
FOR DEPA_KEY IN (' + @COLDEPARTMENTS + ')
) PIVOT_LOCATIONS
WHERE USDE_DAT >= ''' + format(@dDateFrom, 'MM.dd.yyyy') + ''' AND USDE_DAT <= ''' + format(@dDateTo, 'MM.dd.yyyy') + '''
AND USER_KEY IN (' + @USERS_STR + ')
GROUP BY USER_KEY'
SELECT USER_KEY, SUM([120000003]),SUM([120000002]),SUM([140000001])
INTO #tmp
FROM CAUSDE_TAS
PIVOT
(
SUM(USDE_HSU)
FOR DEPA_KEY IN ([120000003],[120000002],[140000001])
) PIVOT_LOCATIONS
WHERE USDE_DAT >= '09.19.2016' AND USDE_DAT <= '03.18.2017'
AND USER_KEY IN (100000002,100000004,100000006,100000008)
GROUP BY USER_KEY
正在返回:
无效的对象名称“tmp”
若我提取动态查询并手动运行它,一切都很好——tmp被创建,我可以查询它。我用SELECT@query提取了查询。而我只是复制粘贴到另一个窗口的选择
提取后的动态查询如下所示:
SELECT @QUERY = 'SELECT USER_KEY, ' + @COLDEPSUMMARY + '
INTO #tmp
FROM CAUSDE_TAS
PIVOT
(
SUM(USDE_HSU)
FOR DEPA_KEY IN (' + @COLDEPARTMENTS + ')
) PIVOT_LOCATIONS
WHERE USDE_DAT >= ''' + format(@dDateFrom, 'MM.dd.yyyy') + ''' AND USDE_DAT <= ''' + format(@dDateTo, 'MM.dd.yyyy') + '''
AND USER_KEY IN (' + @USERS_STR + ')
GROUP BY USER_KEY'
SELECT USER_KEY, SUM([120000003]),SUM([120000002]),SUM([140000001])
INTO #tmp
FROM CAUSDE_TAS
PIVOT
(
SUM(USDE_HSU)
FOR DEPA_KEY IN ([120000003],[120000002],[140000001])
) PIVOT_LOCATIONS
WHERE USDE_DAT >= '09.19.2016' AND USDE_DAT <= '03.18.2017'
AND USER_KEY IN (100000002,100000004,100000006,100000008)
GROUP BY USER_KEY
我不明白如果我只是运行,为什么不创建tmpEXECUTE@Query?在SELECT和FROM之间添加到tmp中是否有效?然后从tmp表中查询?请参阅@Jeremy-如果多个用户同时运行查询,是否有问题?所以每次执行查询时都会创建tmp?临时表是每个用户会话的,所以即使多个用户正在运行,它们也不会发生冲突。tmp表是全局的,如果您使用这种表,您可能会发生冲突。@Jeremy-非常感谢您的回答。我现在唯一的问题是如何查询tmp?查询Select*from tmp为我提供了“无效的对象名”tmp“。它不在动态执行的SQL的范围内,因此请将Select放入字符串中。如果在字符串外部创建了临时表,则可以将其插入,但列是动态的。取决于你想用它做什么,这可能不是一个很好的选择。动态sql有很多问题。请参阅:仅在SELECT和FROM之间添加到tmp中是否有效?然后从tmp表中查询?请参阅@Jeremy-如果多个用户同时运行查询,是否有问题?所以每次执行查询时都会创建tmp?临时表是每个用户会话的,所以即使多个用户正在运行,它们也不会发生冲突。tmp表是全局的,如果您使用这种表,您可能会发生冲突。@Jeremy-非常感谢您的回答。我现在唯一的问题是如何查询tmp?查询Select*from tmp为我提供了“无效的对象名”tmp“。它不在动态执行的SQL的范围内,因此请将Select放入字符串中。如果在字符串外部创建了临时表,则可以将其插入,但列是动态的。取决于你想用它做什么,这可能不是一个很好的选择。动态sql有很多问题。见: