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,但它们都有自己的缺陷。
我得到了这个动态创建的混乱,它基本上采用 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,但它们都有自己的缺陷。