帮帮我解决一个很头痛的SQL问题
2009-12-17 15:08
197 查看
ALTER Procedure [dbo].[WebLiveCount]
@PCID char(20),
@countFlag int,
@date DateTime,
@AdvID int,
@returnValue int output
AS
Declare @tabName varchar(12),@strSql varchar(8000),
@strSql1 varchar(4000),@strSql2 varchar(4000),
@eDate DateTime
Set @eDate = @date
Set @returnValue = 0
While DateDiff(MM,@date,@eDate) < 120
Begin
Set @tabName ='TDC_'+LTrim(DatePart(yyyy,@date))+'_'+LTrim(DatePart(M,@date))
if Not Exists(SELECT * FROM sysobjects WHERE name = @TabName And Xtype='u')
Begin
Set @date = DateAdd(MM,-1,@date)
Continue
End
--Execute CountTabCreate @Date = @date
Set @strSql ='
IF Exists (select * from ['+@tabName+'] Where PCID ='''+@PCID+''' And AdvID = '+Ltrim(@AdvID)+')
Begin
Declare @Edate DateTime,@Err int
Set @Edate = '''+LTrim(Convert(varchar,@eDate,25))+'''
Set @Err = 0
Begin Transaction
'
Set @strSql1 = ''
Set @strSql2=''
IF @countFlag = 1112
Begin
Set @strSql1 = @strSql1 +'
UpDate['+@tabName+'] Set LiveFlag1=LiveFlag1+1,LiveFlagCount=LiveFlagCount+1,
LastLiveDate=@Edate ,LastSafeDate=@Edate
Where LiveFlag1 = 0 And PCID='''+@PCID+''' And AdvID = '+Ltrim(@AdvID)+'
IF @@Error<> 0 Or @@RowCount <1
Begin
Set @Err = 1
GOTO Error
End
Update ['+@tabName+'] Set LiveFlag0=LiveFlag0+1 Where PCID='''+@PCID+'''
And AdvID = '+Ltrim(@AdvID)+' And DateDiff(dd,InsertDate,@Edate) =0
IF @@Error<> 0 Or @@RowCount <1
Begin
Set @Err = 1
GOTO Error
End
'
Set @strSql2 = @strSql2+'LiveDay0=LiveDay0+1,LiveSum = LiveSum +1'
End
IF @countFlag = 1113
Begin
Set @strSql1 = @strSql1 +'
UpDate['+@tabName+'] Set
SafeFlag0=SafeFlag0+(Case When DateDiff(dd,InsertDate,@Edate) =0
Then 1 Else 0 End
) ,
SafeFlag1=SafeFlag1+1,
SafeFlagCount=SafeFlagCount+1,
LastLiveDate=@Edate ,LastSafeDate=@Edate
Where SafeFlag1 = 0
And PCID='''+@PCID+'''
And AdvID = '+Ltrim(@AdvID)+'
IF @@Error<> 0 Or @@RowCount <1
Begin
Set @Err = 1
GOTO Error
End
'
Set @strSql2 = @strSql2+' SafeDay0=SafeDay0+1,SafeSum = SafeSum +1'
End
IF @countFlag = 1115
Begin
Set @strSql1=''
Set @strSql2 = @strSql2+' SafeDay10=SafeDay10+1,SafeSum1=SafeSum1+1'
End
IF @countFlag = 1116
Begin
Set @strSql1=''
Set @strSql2 = @strSql2+' SafeDay20=SafeDay20+1,SafeSum2=SafeSum2+1'
End
IF @strSql2 <> ''
Begin
Set @strSql = @strSql + ' Update [a] set '+@strSql2+'
,LiveDate = @Edate
from [Web_SetupTotal] as a inner join ['+@tabName+'] as b
on( Datediff(dd,a.CountDate,b.InsertDate) = 0 And a.WebID = b.WebID And a.AdvID = b.AdvID )
Where a.AdvID ='+Ltrim(@AdvID)+'
And b.PCID = '''+@PCID+''' And b.LiveFlag1 = 0;
IF @@Error<> 0 Or @@RowCount <1
Begin
Set @Err = 1
GOTO Error
End
'
End
IF @strSql1 <> ''
Begin
Set @strSql = @strSql + @strSql1
End
Set @strSql = @strSql +'
Commit Transaction
select NULL
Error:
IF @@Error <> 0 Or @@RowCount < 1 Or @Err <> 0
Rollback Transaction
Else
select NULL
End
'
Execute(@strSql)
IF @@RowCount > 0
Begin
Set @date = DateAdd(MM,-120,@date)
Set @returnValue = 1
Break
End
Else
Set @date = DateAdd(MM,-1,@date)
End
为什么当LiveFlag1=1的时候,LiveFlag0还进行加一,LiveFlagCount进行加一
@PCID char(20),
@countFlag int,
@date DateTime,
@AdvID int,
@returnValue int output
AS
Declare @tabName varchar(12),@strSql varchar(8000),
@strSql1 varchar(4000),@strSql2 varchar(4000),
@eDate DateTime
Set @eDate = @date
Set @returnValue = 0
While DateDiff(MM,@date,@eDate) < 120
Begin
Set @tabName ='TDC_'+LTrim(DatePart(yyyy,@date))+'_'+LTrim(DatePart(M,@date))
if Not Exists(SELECT * FROM sysobjects WHERE name = @TabName And Xtype='u')
Begin
Set @date = DateAdd(MM,-1,@date)
Continue
End
--Execute CountTabCreate @Date = @date
Set @strSql ='
IF Exists (select * from ['+@tabName+'] Where PCID ='''+@PCID+''' And AdvID = '+Ltrim(@AdvID)+')
Begin
Declare @Edate DateTime,@Err int
Set @Edate = '''+LTrim(Convert(varchar,@eDate,25))+'''
Set @Err = 0
Begin Transaction
'
Set @strSql1 = ''
Set @strSql2=''
IF @countFlag = 1112
Begin
Set @strSql1 = @strSql1 +'
UpDate['+@tabName+'] Set LiveFlag1=LiveFlag1+1,LiveFlagCount=LiveFlagCount+1,
LastLiveDate=@Edate ,LastSafeDate=@Edate
Where LiveFlag1 = 0 And PCID='''+@PCID+''' And AdvID = '+Ltrim(@AdvID)+'
IF @@Error<> 0 Or @@RowCount <1
Begin
Set @Err = 1
GOTO Error
End
Update ['+@tabName+'] Set LiveFlag0=LiveFlag0+1 Where PCID='''+@PCID+'''
And AdvID = '+Ltrim(@AdvID)+' And DateDiff(dd,InsertDate,@Edate) =0
IF @@Error<> 0 Or @@RowCount <1
Begin
Set @Err = 1
GOTO Error
End
'
Set @strSql2 = @strSql2+'LiveDay0=LiveDay0+1,LiveSum = LiveSum +1'
End
IF @countFlag = 1113
Begin
Set @strSql1 = @strSql1 +'
UpDate['+@tabName+'] Set
SafeFlag0=SafeFlag0+(Case When DateDiff(dd,InsertDate,@Edate) =0
Then 1 Else 0 End
) ,
SafeFlag1=SafeFlag1+1,
SafeFlagCount=SafeFlagCount+1,
LastLiveDate=@Edate ,LastSafeDate=@Edate
Where SafeFlag1 = 0
And PCID='''+@PCID+'''
And AdvID = '+Ltrim(@AdvID)+'
IF @@Error<> 0 Or @@RowCount <1
Begin
Set @Err = 1
GOTO Error
End
'
Set @strSql2 = @strSql2+' SafeDay0=SafeDay0+1,SafeSum = SafeSum +1'
End
IF @countFlag = 1115
Begin
Set @strSql1=''
Set @strSql2 = @strSql2+' SafeDay10=SafeDay10+1,SafeSum1=SafeSum1+1'
End
IF @countFlag = 1116
Begin
Set @strSql1=''
Set @strSql2 = @strSql2+' SafeDay20=SafeDay20+1,SafeSum2=SafeSum2+1'
End
IF @strSql2 <> ''
Begin
Set @strSql = @strSql + ' Update [a] set '+@strSql2+'
,LiveDate = @Edate
from [Web_SetupTotal] as a inner join ['+@tabName+'] as b
on( Datediff(dd,a.CountDate,b.InsertDate) = 0 And a.WebID = b.WebID And a.AdvID = b.AdvID )
Where a.AdvID ='+Ltrim(@AdvID)+'
And b.PCID = '''+@PCID+''' And b.LiveFlag1 = 0;
IF @@Error<> 0 Or @@RowCount <1
Begin
Set @Err = 1
GOTO Error
End
'
End
IF @strSql1 <> ''
Begin
Set @strSql = @strSql + @strSql1
End
Set @strSql = @strSql +'
Commit Transaction
select NULL
Error:
IF @@Error <> 0 Or @@RowCount < 1 Or @Err <> 0
Rollback Transaction
Else
select NULL
End
'
Execute(@strSql)
IF @@RowCount > 0
Begin
Set @date = DateAdd(MM,-120,@date)
Set @returnValue = 1
Break
End
Else
Set @date = DateAdd(MM,-1,@date)
End
为什么当LiveFlag1=1的时候,LiveFlag0还进行加一,LiveFlagCount进行加一
相关文章推荐
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- 一个SQL字符串问题的解决
- 一个关于sql语句的问题解决,包括:字符串拆分,游标
- 今天终于解决了一个头痛了两天的地图开发问题
- 一个mysql解决的问题:游标、字符串操作 类似另一篇 sql
- 解决WebService[WebMethod]方法返回一个SqlDataReader出错问题
- 树结构查询——一个SQL解决问题
- 一个奇怪网络问题的解决:执行sql时客户端卡死
- 一个共享库的问题导致sqlplus用不了了的解决办法!
- mysql5.7中的一个update order by排名问题解决办法(一条sql搞定排名)
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 项目中一个简单SQL查询问题,已经解决了,留个纪念,非常感谢帮我的朋友们。
- SQL order by ID desc/asc加一个排序的字段解决查询慢问题
- 用sql解决一个人口统计的问题
- 终于解决了一个让大家头痛的问题
- 一个博友的SQL问题解决过程
- 给以前大学的同学解决了一个小问题,sql的一个普遍的用法
- 执行SQL语句时出现问题操作必须使用一个可更新的查询错误的解决方法
- 一次ORA-4030问题诊断及解决【解决思路不错,说明了对象的统计信息与优化器的优化操作(即选择执行一个SQL语句在该优化参数环境下最佳的执行计划)间的关系】