Select 进入 #Temp 不使用 PIVOT

Select Into #Temp not working with a PIVOT

我得到了这个动态创建的混乱,它基本上采用 table 中的所有字段并将两个记录相互比较:

DECLARE @ID1 AS VarChar(3)
DECLARE @ID2 AS VarChar(3)

Set @ID1 = '42'
Set @ID2 = '600'

-- Where clause params
DECLARE @whereClauseParam VARCHAR(MAX) = '['+@ID1+'] <> ['+@ID2+']' 

--***************************************--
--********  tblSQLAdminInventory ********--
--***************************************--
--Get the Fields required for the initial pivot
DECLARE @AIFields VARCHAR(MAX)= '';
DECLARE @AIFields2 VARCHAR(MAX)= '';

SELECT @AIFields+=QUOTENAME(t.name)+', '
FROM sys.columns AS t
WHERE t.object_id = OBJECT_ID('tblSQLAdminInventory')
    AND t.name <> 'TransID'
    --AND t.system_type_id = '56';

SELECT @AIFields2+='Convert(VarChar(250), '+QUOTENAME(t.name)+') AS '+ QUOTENAME(t.name) +', '
FROM sys.columns AS t
WHERE t.object_id = OBJECT_ID('tblSQLAdminInventory')
    AND t.name <> 'TransID'
    --AND t.system_type_id = '56';
--56 (Int)
--61 (DateTime)
--104 (Bit)
--167 (VarChar)
--231 (NVarChar)

-- Get the KeyId's with alias added
DECLARE @AIkeyIDs VARCHAR(MAX),       
        @AIkeyIDs1 VARCHAR(MAX);

SELECT  @AIkeyIDs = COALESCE(@AIkeyIDs + ',','') + QUOTENAME(t.TransID) + ' AS [KeyID_' + CAST(t.TransID AS VARCHAR(10)) + ']',
        @AIkeyIDs1 = COALESCE(@AIkeyIDs1 + ',','') + QUOTENAME(t.TransID)
FROM    tblSQLAdminInventory AS t
WHERE   TransID IN (@ID1, @ID2);

--Generate Dynamic SQL
DECLARE @AISQL2 VARCHAR(MAX)= 'SELECT Value AS FieldName, ';

SELECT @AISQL2+=@AIkeyIDs+'
FROM
(SELECT TransID, Value, FieldName
FROM 
   (SELECT TransID, '+SUBSTRING(@AIFields2, 1, LEN(@AIFields2)-1)+'
   FROM tblSQLAdminInventory) p
UNPIVOT
   (FieldName FOR Value IN 
      ('+SUBSTRING(@AIFields, 1, LEN(@AIFields)-1)+')
)AS unpvt) AS SourceTable
PIVOT
(
MAX(FieldName)
FOR TransID IN ('+@AIkeyIDs1+')
) AS PivotTable
WHERE '+@whereClauseParam

EXECUTE(@AISQL2);

问题是,它似乎不允许我将结果放入临时 table。我尝试使用此代码,但它一直告诉我#Temp1 对象不存在:

SELECT @AISQL2+=@AIkeyIDs+'
    INTO #Temp1
FROM
(SELECT TransID, Value, FieldName
FROM 
   (SELECT TransID, '+SUBSTRING(@AIFields2, 1, LEN(@AIFields2)-1)+'
   FROM tblSQLAdminInventory) p
UNPIVOT
   (FieldName FOR Value IN 
      ('+SUBSTRING(@AIFields, 1, LEN(@AIFields)-1)+')
)AS unpvt) AS SourceTable
PIVOT
(
MAX(FieldName)
FOR TransID IN ('+@AIkeyIDs1+')
) AS PivotTable
WHERE '+@whereClauseParam

我做错了什么?

您正在使用动态 SQL。 EXECUTE 语句启动了一个全新的范围,临时 table 在该范围内不可用。

有几种解决方法,例如使用您清除的永久 table 或使用全局临时 table,但它们都有自己的缺陷。