У меня похожая проблема, но ни одно из предложенных здесь решений не помогает мне.У меня есть 6 if, аналогичных этим двум в хранимой процедуре, и это не позволит мне изменить процедуру, что не имеет смысла, это может сработать.Выдает ту же ошибку при изменении процедуры.Я должен иметь в #tbl в каждом if, потому что каждый if имеет выбор с различными столбцами, и я не хочу создавать таблицы для каждого выбора.Другой вариант - динамическое выделение ...
Я должен был сделать его динамическим (не все), например так:
IF @Type = '1'
SELECT
col1
INTO #tbl1
FROM Table1
ELSE IF @Type = '2'
SELECT
col1
,col2
INTO #tbl2
FROM Table2
--IF...
DECLARE @sql VARCHAR(MAX) = '
select
*
from #tbl' + @Type
EXEC (@sql)
Но в вашем случае вы должны создать временную таблицу вручную, потому что выИспользует ту же структуру и просто добавляет значение.
Если вам лень создавать временную таблицу со всеми столбцами, другое решение будет следующим:
ALTER PROCEDURE sp_Member (
@comcode INT = 0
, @SubComCode INT = 0
)
AS
BEGIN
SET NOCOUNT ON
SELECT CONVERT(DECIMAL(18, 2), 0) TurnOver
, *
INTO #result
FROM tbmember
WHERE can_flag = 'N'
IF @comcode = '0'
BEGIN
UPDATE r
SET TurnOver = (SELECT SUM(amount)
FROM tbcoudet
WHERE memcode = r.memcode
AND expyear = (SELECT MAX(expyear)
FROM tbexpyear
)
AND EXISTS ( SELECT itemcode
FROM tbitem
WHERE comcode = @comcode
AND SubComCode = @SubComCode
AND itemcode = tbcoudet.itemcode )
GROUP BY memcode
, expyear
)
FROM #result r
END
IF @SubComCode = '0'
BEGIN
UPDATE r
SET TurnOver = (SELECT SUM(amount)
FROM tbcoudet
WHERE memcode = r.memcode
AND expyear = (SELECT MAX(expyear)
FROM tbexpyear
)
AND EXISTS ( SELECT itemcode
FROM tbitem
WHERE comcode = @comcode
AND itemcode = tbcoudet.itemcode )
GROUP BY memcode
, expyear
)
FROM #result r
END
SELECT TOP 10
*
FROM #result
WHERE TurnOver IS NOT NULL
ORDER BY TurnOver DESC
END