Я согласен с комментарием @Джона Дьюи: у вас не должно быть столбца для каждого дня недели, а должен быть один столбец с днем недели.Предполагая на мгновение, что вы не можете исправить неисправную схему, затем вам нужно понять, что CASE
- это выражение, которое возвращает значение, а не элемент управления потоком, как это работает в некоторых других языках.Это означает, что вы не можете сказать CASE THEN something THEN go do something else
.
Вот один из способов написания вашего оператора, который уменьшит хотя бы некоторую избыточность, которую вы пытаетесь:
SET @DayName = dbo.GetWeekDayNameOfDate(@SaleDate);
INSERT dbo.Tmp_Data(ProductID,ProductName,NetProfit,
Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday)
SELECT @ProductId,@ProductName,@Profit,
CASE @DayName WHEN 'Sunday' THEN @Qty END,
CASE @DayName WHEN 'Monday' THEN @Qty END,
CASE @DayName WHEN 'Tuesday' THEN @Qty END,
CASE @DayName WHEN 'Wednesday' THEN @Qty END,
CASE @DayName WHEN 'Thursday' THEN @Qty END,
CASE @DayName WHEN 'Friday' THEN @Qty END,
CASE @DayName WHEN 'Saturday' THEN @Qty END;
Вы также можете построить оператор в динамическом SQL.Не так, как я бы предпочел, просто включив этот вариант для краткости.
SET @DayName = dbo.GetWeekDayNameOfDate(@SaleDate);
DECLARE @sql NVARCHAR(4000);
SET @sql = N'INSERT dbo.Tmp_Data(ProductID,ProductName,NetProfit,'
+ @DayName + ') SELECT '
+ CONVERT(VARCHAR(12), @ProductId) +','
+ '''' + @ProductName + ''','
+ CONVERT(VARCHAR(12), @Profit) + ','
+ CONVERT(VARCHAR(12), @Qty) + ';';
PRINT @sql;
-- EXEC sp_executesql @sql;