必须在sql过程中声明标量变量“@tempattend”吗?

时间:2013-10-16 13:11:32

标签: sql sql-server

我收到一条错误,指出我必须声明表变量“@tempattend”。 请帮我。如何将@tempattend表格传递给@tempTableSelect变量?

ALTER PROCEDURE [dbo].[Rl_LM_AHS]

 @SupEmpID nvarchar(10),
 @SectorName nvarchar(300),
 @dateList nvarchar(300),
 @Month nvarchar(5),
 @Year nvarchar(5),
 @SearchType nvarchar(10)


AS
BEGIN
    SET NOCOUNT ON;
    declare @tempTableSelect nvarchar(2000)
    DECLARE @tempattend Table
(
    [Emp.ID] nvarchar(10),
    [Name] nvarchar(60),
    [1] nvarchar(3) null,
    [2] nvarchar(3) null,
    [3] nvarchar(3) null
    upto ..............
    [31] nvarchar(3) null
)

IF (@SearchType = 1)
    BEGIN

--INSERT TEAM LIST TO @tempattend TABLE
 insert into @tempattend([Emp.ID],[Name]) (Select EMP.empID as [Emp.ID],CONCAT(EMP.emp_fname,' ',COALESCE(nullif(EMP.emp_Mname,'') +' ',''),COALESCE(nullif(EMP.emp_Lname,'') +' ','')) as [Name] from EShiftHistory)

set @tempTableSelect = 'select [Emp.ID],Name,' + @dateList +' from @tempattend'

    EXEC (@tempTableSelect)

    END


END

2 个答案:

答案 0 :(得分:5)

你应该写

set @tempTableSelect = 'select [Emp.ID],Name,' + @dateList +' from @tempattend'

@tempattend是一个临时表变量。它拥有一个表,而不是@datelist之类的值。

但为什么你EXEC而不是直接从表中选择?


想一想:在EXEC语句中可能无法使用内存临时表。试试这个

DECLARE @tempattend Table

CREATE TABLE #tempattend

并将@tempattend的每次出现更改为#tempattend

答案 1 :(得分:0)

跟进Thorsten Dittmar的答案,为什么不这样呢?

select empID,
 CONCAT(emp_fname,' ',
 COALESCE(emp_Mname,''),
 COALESCE(nullif(emp_Lname,''))) as [Name]
    from EShiftHistory

我意识到您正尝试使用@dateList变量进行一些动态选择,但这是一个强烈信号,您应该规范化表,只需让您的客户端代码选出它想要哪些列。 (并非所有内容都需要在原始SQL中完成。)

数字作为列名?绝对有问题。