日期:2014-05-17  浏览次数:20581 次

求潜水员帮忙看下这段预存
declare @i AS INT;
declare @N AS INT;
declare @i1 AS INT;
declare @N1 AS INT;

declare @strNow nvarchar(10);
declare @strInsertPi varchar(4000);
declare @strInsertPi1 varchar(4000);
declare @strCreateDate varchar(8000);
declare @dateTemp nvarchar(10);
declare @DateNow nvarchar(10);
DECLARE @NowYear nvarchar(4);
DECLARE @NowMonth nvarchar(2);

set @strNow='2012-08-01'

set @NowYear=convert(varchar(4),year(@strNow))
set @NowMonth=convert(varchar(2),month(@strNow))
set @DateNow= @NowYear+'/'+@NowMonth+'/01'



IF EXISTS (SELECT 1 FROM tempdb.dbo.sysobjects where name ='##tempPINew')
BEGIN
drop table ##tempPINew  
end
set @strCreateDate = 'create table ##tempPINew (id_pi int,pidate varchar(10),id_t char(1),x float) '
BEGIN TRAN
exec (@strCreateDate)


--1循環向前推12個月
set @i1=1
set @N1=12
while @i1<=@N1
begin 
set @DateNow=convert(varchar(10),dateadd(month,-1,@DateNow),121)

--2按該月天數,循環指定次數,填充對應SQL字句
set @i=1
set @N=datediff(day,@DateNow,dateadd(month,1,@DateNow))
set @strInsertPi=''
while @i<=@N
begin 
set @dateTemp=convert(varchar(10),dateadd(day,@i-1,@DateNow),121)
--創建臨時表 ##tempPINew SQL
set @strInsertPi = @strInsertPi +' insert into ##tempPINew(id_pi,PIdate,id_t,x) values (' + convert(varchar(2),month(@DateNow)) + ','''+@dateTemp+''',''P'',''24'')'
set @i=@i+1
end
set @strCreateDate = @strInsertPi
BEGIN TRAN
exec (@strCreateDate)
--2
set @i1=@i1+1
end
--1

错误说明:
如果直接在预存中带入变量执行,OK!
如果是点击执行预存程序执行,会出现以下错误:
訊息 266,層級 16,狀態 2,程序 ProGetGroupDUR,行 0
EXECUTE 之後的交易計數顯示 BEGIN 和 COMMIT 陳述式數目不相符。前次計數 = 0,目前的計數 = 1。

(1 個資料列受到影響)


里面是不是少了什么?有没有说帮忙修改下,谢谢!









------解决方案--------------------
SQL code
--1循環向前推12個月
SET @i1 = 1
SET @N1 = 12
WHILE @i1 <= @N1 
    BEGIN  
        SET @DateNow = CONVERT(VARCHAR(10), DATEADD(month, -1, @DateNow), 121)

--2按該月天數,循環指定次數,填充對應SQL字句
        SET @i = 1
        SET @N = DATEDIFF(day, @DateNow, DATEADD(month, 1, @DateNow))
        SET @strInsertPi = ''
        WHILE @i <= @N 
            BEGIN  
                SET @dateTemp = CONVERT(VARCHAR(10), DATEADD(day, @i - 1,
                                                             @DateNow), 121)
--創建臨時表 ##tempPINew SQL
                SET @strInsertPi = @strInsertPi
                    + ' insert into ##tempPINew(id_pi,PIdate,id_t,x) values ('
                    + CONVERT(VARCHAR(2), MONTH(@DateNow)) + ',''' + @dateTemp
                    + ''',''P'',''24'')'
                SET @i = @i + 1
            END
        SET @strCreateDate = @strInsertPi
        BEGIN TRAN                             --=============??? 没有commit 也没有对应的rollback
        EXEC (@strCreateDate)
--2
        SET @i1 = @i1 + 1
    END
--1