Reputation: 11
I have some dynamic code in my stored procedure; in the first part, a variable is being assigned, when I am using that variable later in the dynamic code, it is not working as expected.
Relevant block of the code is as follows:
SET @SQL += N' DECLARE @YearValues AS NVARCHAR(MAX);
SELECT @YearValues = COALESCE(@YearValues + '', '', '''') + QUOTENAME(Y.Years)
FROM ( SELECT DISTINCT BT.Years
FROM #BaseTable AS BT) AS Y
ORDER BY Y.Years;
SET @YearValues = Right(@YearValues,ABS(len(@YearValues)-2));
SELECT PVT.Region
, PVT.prdName
, PVT.Type
, PVT.Unit
, PVT.ShareValue
, @YearValues
FROM (
SELECT BT.Region
, BT.prdName
, BT.Unit
, BT.Type
, BT.Years
FROM #BaseTable AS BT
WHERE EXISTS (SELECT 1
FROM #TypeSelected AS TS
WHERE TS.Type = BT.Type)
) AS Source
PIVOT (
MAX(ShareValue) FOR Years IN (@YearValues)
) AS PVT
';
EXEC sys.sp_executesql @stmt = @SQL
I tried to create #BaseTable
as a global temp table, it works fine but as per my company policy I shouldn't use global temp tables. Is there any workaround for this?
Upvotes: 0
Views: 51
Reputation: 72194
You have a number of issues here:
STRING_AGG
or FOR XML
instead.ShareValue
column in the inner query you are pivoting.DECLARE @YearValues AS NVARCHAR(MAX);
SELECT @YearValues =
STRING_AGG(QUOTENAME(Y.Years), ', ') WITHIN GROUP (ORDER BY Y.Years)
FROM (
SELECT DISTINCT
BT.Years
FROM #BaseTable AS BT
) AS Y;
SET @SQL = '
SELECT
PVT.Region
, PVT.prdName
, PVT.Type
, PVT.Unit
, ' + @YearValues + '
FROM (
SELECT
BT.Region
, BT.prdName
, BT.Unit
, BT.Type
, BT.Years
, BT.ShareValue
FROM #BaseTable AS BT
WHERE EXISTS (SELECT 1
FROM #TypeSelected AS TS
WHERE TS.Type = BT.Type
)
) AS Source
PIVOT (
MAX(ShareValue) FOR Years IN (
' + @YearValues + '
)
) AS PVT;
';
EXEC sys.sp_executesql @stmt = @SQL
Upvotes: 1