0

我收到一条错误消息,指出我必须声明表变量“@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
4

2 回答 2

5

你应该写

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

@tempattend是一个临时表变量。它包含一个表格,而不是像@datelist.

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


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

DECLARE @tempattend Table

进入

CREATE TABLE #tempattend

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

于 2013-10-16T13:16:03.900 回答
0

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

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

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

数字作为列名?肯定有问题。

于 2013-10-16T13:28:40.627 回答