首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在游标声明时将变量作为"select“语句传递的可能性

在游标声明时将变量作为"select“语句传递的可能性
EN

Stack Overflow用户
提问于 2013-03-13 20:39:49
回答 2查看 818关注 0票数 0

我在sql server中创建了一个表值函数,并在游标声明处将一个'select‘statemetn作为传递变量存储在变量中,它显示了错误。

我的错误是

代码语言:javascript
复制
Incorrect syntax near '@QUERY'.

我的函数是

代码语言:javascript
复制
CREATE FUNCTION WEEKLY_REPORT(@START_DATE DATETIME, @END_DATE DATETIME,@PRACTISE NVARCHAR(MAX))
RETURNS @WEEKLY_REPORT_DETAILS_INFORMATION TABLE
(
    RESOURCE_NAME NVARCHAR(MAX),
    DAY1 DECIMAL(5,2),
    DAY2 DECIMAL(5,2),
    DAY3 DECIMAL(5,2),
    DAY4 DECIMAL(5,2),
    DAY5 DECIMAL(5,2),
    DAY6 DECIMAL(5,2),
    DAY7 DECIMAL(5,2),
    UTILIZATION INT
)
AS 
BEGIN
DECLARE
    @RESOURCE_NAME NVARCHAR(MAX),
    @DAY1 DECIMAL(5,2),
    @DAY2 DECIMAL(5,2),
    @DAY3 DECIMAL(5,2),
    @DAY4 DECIMAL(5,2),
    @DAY5 DECIMAL(5,2),
    @DAY6 DECIMAL(5,2),
    @DAY7 DECIMAL(5,2),
    @UTILIZATION INT,
    @MONTH NVARCHAR(MAX),
    @START_DAY INT,
    @END_DAY INT,
    @COUNT INT,
    @COUNT_TEST INT,
    @QUERY NVARCHAR(MAX);
BEGIN
    SET @MONTH = DATENAME(MONTH,@START_DATE)
    SET @START_DAY = DATENAME(DAY,@START_DATE)
    SET @END_DAY = DATENAME(DAY,@END_DATE)
    SET @COUNT = @END_DAY -@START_DAY + 1
    SET @QUERY='SELECT A.NAME, '
    SET @COUNT_TEST = 1
WHILE @COUNT_TEST <= @COUNT
BEGIN
    IF(@COUNT_TEST =@COUNT)
        SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@START_DAY)
ELSE
    SET @QUERY=@QUERY + 'B.D' + CONVERT(NVARCHAR ,@START_DAY) + ', ' 
SET @START_DAY = @START_DAY + 1
SET @COUNT_TEST =@COUNT_TEST + 1 
END

SET @QUERY = @QUERY + ' FROM EMPLOYEE A INNER JOIN CP_DETAILS B' +
            ' ON A.ID = B.EMPLOYEE_ID WHERE B.MONTH_USED = ' + '''' + @MONTH     + '''' +
            ' AND B.YEAR_USED = ' + DATENAME(YEAR,@START_DATE) + 
            ' AND B.PRACTISE=' + '''' + @PRACTISE + ''''

DECLARE CP_DETAILS CURSOR FOR @QUERY-- facing error here

OPEN CP_DETAILS
FETCH NEXT FROM CP_DETAILS INTO @RESOURCE_NAME,@DAY1,@DAY2,@DAY3,@DAY4,@DAY5,@DAY6,@DAY7

WHILE (@@FETCH_STATUS =0)
BEGIN
    SET @UTILIZATION = dbo.UTILIZATION(@START_DATE,@END_DATE,@DAY1,
                                    @DAY2,@DAY3,@DAY4,@DAY5,@DAY6,@DAY7)
    INSERT INTO @WEEKLY_REPORT_DETAILS_INFORMATION VALUES(@RESOURCE_NAME,
                @DAY1,@DAY2,@DAY3,@DAY4,@DAY5,@DAY6,@DAY7,@UTILIZATION)

    FETCH NEXT FROM CP_DETAILS INTO @RESOURCE_NAME,@DAY1,@DAY2,@DAY3,@DAY4,@DAY5,@DAY6,@DAY7
END
CLOSE CP_DETAILS
DEALLOCATE CP_DETAILS
END
RETURN 

END
EN

回答 2

Stack Overflow用户

发布于 2013-03-13 20:47:09

您不能以这种方式声明游标。必须编写select语句,而不是使用select语句字符串传递变量。

请参阅更多信息的文档。

票数 0
EN

Stack Overflow用户

发布于 2013-03-13 22:54:04

尝试创建另一个临时表并在游标之前执行@QUERY,而不是使用temp table中的select语句写入游标

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15385625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档