当前位置: 首页 > 面试题库 >

Cursorfetch:在INTO列表中声明的变量数量必须与所选列的数量匹配

段干浩荡
2023-03-14
问题内容
declare @id int
declare @empid int
set @id = 0
declare @schedindate datetime
declare @ss nvarchar(100)
declare @indice nvarchar(2)
declare @FromDate datetime
declare @ToDate datetime
declare @TimeInR datetime
declare @TimeOutR datetime
set @FromDate = '2009-01-14'
set @ToDate = '2010-01-30'

Declare cc cursor for select distinct empid from ta_timecard where schedindate between @FromDate and @ToDate
open cc
fetch next from cc into @empid
while (@@fetch_status = 0)
begin
    set @id = @id + 1
    insert into ta_MonthlyAttendance (ID, EmpID) values (@id, @empid)

    declare cc2 cursor for select distinct schedindate, TimeInR, TimeOutR from ta_timecard where empid = @empid and schedindate between @FromDate and @ToDate
    open cc2
    fetch next from cc2 into @schedindate, @TimeInR
    while (@@fetch_status = 0)
    begin

        set @indice = cast(datediff(day, @fromdate, @schedindate) as nvarchar(4))
        set @TimeInR = (select TOP 1 ta_TimeCard.TimeInR from ta_TimeCard where (@schedindate between @FromDate and @ToDate) and EmpID=@empid)
        set @schedindate = (select TOP 1 ta_TimeCard.SchedInDate from ta_TimeCard where (@schedindate between @FromDate and @ToDate) and empid=@empid)
        set @ss = 'update ta_MonthlyAttendance set NOD ' + @indice  + ' = + dbo.ta_dayofweek('+ char(39) + convert(nvarchar(50), @schedindate, 102) + char(39) +' ) , TimeInR ' + @indice + ' =  + @TimeInR + where empid = ' + cast(@empid as nvarchar(20))
        execute sp_executesql @ss
        fetch next from cc2 into @schedindate, @TimeInR
end
close cc2
deallocate cc2
fetch next from cc into @empid
end
close cc
Deallocate cc

这段代码在“从cc2下一步提取到@ schedindate,@ TimeInR”行中给出错误,这是我的错吗?我找不到它..谢谢..


问题答案:

试试这个-

DECLARE 
      @empid INT
    , @schedindate DATETIME
    , @ss NVARCHAR(100)
    , @indice NVARCHAR(2)
    , @FromDate DATETIME
    , @ToDate DATETIME
    , @TimeInR DATETIME
    , @TimeOutR DATETIME

SELECT 
      @FromDate = '20090114'
    , @ToDate = '20100130'

DECLARE @temp TABLE
(
      schedindate DATETIME
    , TimeInR VARCHAR(10)
    , TimeOutR VARCHAR(10)
    , empid INT
)
INSERT INTO @temp (schedindate, TimeInR, TimeOutR, empid)
SELECT DISTINCT
      schedindate
    , TimeInR
    , TimeOutR
    , empid 
FROM dbo.ta_timecard
WHERE schedindate BETWEEN @FromDate AND @ToDate

DECLARE @ids TABLE(id BIGINT IDENTITY(1,1), emp BIGINT)
INSERT INTO @ids (emp)
SELECT DISTINCT empid
FROM @temp

INSERT INTO dbo.ta_MonthlyAttendance(id, EmpID)
SELECT id, emp
FROM @ids

DECLARE cc CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
    SELECT DISTINCT empid
    FROM @temp

OPEN cc
FETCH NEXT FROM cc INTO @empid

WHILE (@@fetch_status = 0) BEGIN

    SELECT
          @indice = CAST(DATEDIFF(DAY, @fromdate, t.SchedInDate) AS NVARCHAR(4))
        , @TimeInR = t.TimeInR
        , @schedindate = t.SchedInDate
    FROM @temp t
    WHERE empid = @empid

    SELECT @ss = 'update ta_MonthlyAttendance set NOD ' + @indice 
        + ' = + dbo.ta_dayofweek(' + CHAR(39) 
        + CONVERT(NVARCHAR(50), @schedindate, 102) + CHAR(39) + ' ) , TimeInR ' 
        + @indice + ' = ' + @TimeInR + ' where empid = ' + CAST(@empid AS NVARCHAR(20))

    EXEC sys.sp_executesql @ss

    FETCH NEXT FROM cc INTO @empid

END

CLOSE cc
DEALLOCATE cc


 类似资料:
  • 问题内容: 我正在尝试使用EF5从bcontext.Database.SqlQuery执行存储过程。 它抛出一个错误 如果customerNumber是staff,则SP返回,否则返回行。 如何处理? 问题答案: 由于使用的是命名参数,因此必须为要传递的参数指定匹配名称。

  • 问题内容: 我有一个返回错误的过程: 必须声明表变量“ @PropIDs”。 但随后出现以下消息: (受影响的123行) 使用以下命令执行时出现错误 但是在以下情况下可以正常工作 有人可以帮我吗?步骤: 我在声明这样的表时找到了一种解决方案: 但是,当从C#(linq sql)执行过程时,它将返回错误 问题答案: 问题在于您正在将动态SQL与非动态SQL混淆在一起。 首先-将NULL放入@NotN

  • 问题内容: 我创建了一个SQL脚本以在另一个数据库中添加一个条目。但是,当我通过SQL Server Management Studio运行脚本时。 我收到以下错误: 必须声明标量变量“ @address” 在这一点上,我完全感到困惑,因为在执行语句之前已经声明了变量。是因为我正在遍历其他数据库吗? 到目前为止,我只是为了完成任务而将实际值放在语句中,尽管我想知道是什么引起了错误。 问题答案: 变

  • 问题内容: 当我尝试执行以下查询时: 我收到一个错误: #1327-未声明的变量:newsletter_to_send 该查询有什么问题? 问题答案: http://dev.mysql.com/doc/refman/5.1/zh-CN/insert- select.html PS:您确定不需要in 子句吗?

  • let和const是JavaScript里相对较新的变量声明方式。 像我们之前提到过的,let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题。 const是对let的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持let和const。 下面我们会详细说明这些新的声明方式以及为什么推荐使用它们来代替v

  • 局部变量使用关键字 def 来声明,其只在声明它的地方可见 . 局部变量是 Groovy 语言的一个基本特性. 例子 13.2 . 使用局部变量 def dest = "dest" task copy(type: Copy) { form "source" into dest }