我想从@query
选择表变量。
以下是@query
:
SELECT @QUERY = 'SELECT DISTINCT USER_KEY, (SELECT TOP(1) USER_FNM FROM BAUSER WHERE BAUSER.USER_KEY = PIVOT_LOCATIONS.USER_KEY), ' + @COLDEPSUMMARY + '
FROM CAUSDE_TAS
PIVOT
(
SUM(USDE_HSU)
FOR DEPA_KEY IN (' + @COLDEPARTMENTS + ')
) PIVOT_LOCATIONS
WHERE USDE_DAT >= ''' + format(@DATEFROM, 'MM.dd.yyyy') + ''' AND USDE_DAT <= ''' + format(@DATETO, 'MM.dd.yyyy') + '''
AND USER_KEY IN (' + @USERS_STR + ')
GROUP BY USER_KEY'
EXECUTE (@QUERY)
我想要做的是从EXECUTE(@QUERY)
获取结果并将这些结果插入临时@USERS
表中:
DECLARE @USERS TABLE
(
USER_KEY INT,
USER_FNM VARCHAR(50),
USDE_HSU DECIMAL(8,2),
[110000003] DECIMAL(8,2),
[120000002] DECIMAL(8,2),
[120000003] DECIMAL(8,2),
[120000004] DECIMAL(8,2),
[120000005] DECIMAL(8,2),
[120000006] DECIMAL(8,2),
[120000007] DECIMAL(8,2),
[120000008] DECIMAL(8,2)
)
这可能吗?
答案 0 :(得分:1)
应该像
一样简单INSERT INTO @USERS
EXECUTE(@QUERY)
鉴于您事先已做出所有适当的声明。
示例:
declare @something table (
someint int
)
declare @query varchar(max);
select @query = 'select 1
union all
select 2';
insert into @something (someint)
execute(@query)
select * from @something
产量
someint
1
2
答案 1 :(得分:0)
如果将表变量切换到临时表,则可以在同一批次的动态SQL中插入。这样可以避免在下一节中列出可能的未来错误。
CREATE TABLE #USERS (...);
DECLARE @SQL NVARCHAR(MAX) = N'
INSERT #USERS (USER_KEY, ...)
SELECT USER_KEY, ' + @COLDEPSUMMARY + N', ...';
EXEC sp_executesql @SQL, N'@DATEFROM DATE, @DATETO DATE, ...', @DATEFROM, @DATETO, ...;
您还会注意到我使用了sp_executesql
。 It's generally a bad practice to use EXEC
instead of sp_executesql
。您将无法使用动态列部分的参数,但您至少可以使用它来传递其他参数,例如@DATEFROM
和@DATETO
。 You can also pass your other parameter @USERS_STR
if you convert to a table type beforehand
如前所述,我建议尽可能不使用INSERT....EXEC
,因为如果您使用嵌套存储过程,它最终会导致以下错误:
Msg 8164,Level 16,State 1
无法嵌套INSERT EXEC语句。
示例:
CREATE PROC #Test1
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #Test1 ( A INT );
INSERT #Test1
EXEC('SELECT 1')
END;
GO
CREATE PROC #Test2
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #Test2 ( B INT );
INSERT #Test2
EXEC #Test1
END;
GO
EXEC #Test2;
答案 2 :(得分:0)
您必须使用表函数作为示例:
create FUNCTION [dbo].[Get_Some_Table] (
@Id int
)
RETURNS @tbResults TABLE (
uId uniqueidentifier,
sType VARCHAR(5),
sCode VARCHAR(50)
)
AS
BEGIN
-- select, insert into, create various @tables ecc...
RETURN
END
GO
然后使用:
INSERT INTO @tb (uId, sType, sCode) SELECT uId,sType,sCode FROM dbo.Get_Same_Table(@id)
这可以防止NESTED INSERT EXEC 并使用相同的代码行。 希望这有帮助,见到你!