請教一個mssql存儲過程的問題(200分)

  • 主题发起人 主题发起人 stuwe
  • 开始时间 开始时间
S

stuwe

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是一個存儲過程的內容
----------------------------------------------------------------------------
declare @SQL_str varchar(8000)
declare @tmp_str varchar(300)
declare @CLMC sysname
declare @DDCMC sysname
declare @DDType sysname
execute('select convert(varchar(300),'''') as Field1 into #MytempTable')--創建臨時表,存放sql語句
execute('declare SQL_Cursor cursor for select Field1 from #MytempTable')
begin

declare CL_Cursor cursor
for
select distinct CLMC from CLJGB where IsNull(CLMC,'')<>''
open CL_Cursor--打開材料遊標

declare DDCMC_Cursor cursor scroll
for
select b.DDCMC from DDCZLB a left join DDCZLB b on a.DDCBH=b.DDCBH
where a.DDCBH is not NULL order by a.DDCBH
open DDCMC_Cursor--打開電鍍廠名稱遊標

fetch next from CL_Cursor into @CLMC
while (@@fetch_status=0)
begin
fetch absolute 1 from DDCMC_Cursor into @DDCMC
while (@@fetch_status=0)
begin
if exists(select distinct DDLX from DDFYZLB_temp_view where CLMC=@CLMC)
begin--存在電鍍類型
declare DDType_Cursor cursor
for
select distinct DDLX from DDFYZLB_temp_view where CLMC=@CLMC
open DDType_Cursor
fetch next from DDType_Cursor into @DDType
while (@@fetch_status=0)
begin
if (@SQL_str='')
set @SQL_str='sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' and DDLX='''+@DDType+''' then DDJE else NULL end) as '+@CLMC+'|'+@DDCMC+'|'+@DDType
else
set @SQL_str=@SQL_str+',sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' and DDLX='''+@DDType+''' then DDJE else NULL end) as '+@CLMC+'|'+@DDCMC+'|'+@DDType
fetch next from DDType_Cursor into @DDType
end
close DDType_Cursor
deallocate DDType_Cursor
end
else
begin --不存在電鍍類型
if (@SQL_str='')
set @SQL_str='sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' then DDJE else NULL end) as '+@CLMC+'|'+@DDCMC
else
set @SQL_str=@SQL_str+',sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' then DDJE else NULL end) as '+@CLMC+'|'+@DDCMC
end
fetch next from DDCMC_Cursor into @DDCMC
end

execute('insert into #MytempTable (Field1)values('+@SQL_str+')');
set @SQL_str=''
fetch next from CL_Cursor into @CLMC
end

close DDCMC_Cursor
deallocate DDCMC_Cursor
close CL_Cursor
deallocate CL_Cursor

set @SQL_str=''
declare @I integer
set @I=0

open SQL_Cursor
fetch next from SQL_Cursor into @tmp_str
while (@@fetch_status=0)
begin
if(@SQL_str='')
set @SQL_str='select YSBH,YSMC,'+@tmp_str+' from DDFYZLB_temp_view group by YSBH,YSMC'
else
begin
set @SQL_str='select A'+rtrim(ltrim(str(@I-1)))+'.*,A'+rtrim(ltrim(str(@I)))+'.* from ('+@SQL_str+') as A'+rtrim(ltrim(str(@I-1)))
set @SQL_str=@SQL_str+' left join (select YSBH as YSBH_Hide,'+@tmp_str+' from DDFYZLB_temp_view group by YSBH) as A'+rtrim(ltrim(str(@I)))+' on A'+rtrim(ltrim(str(@I-1)))+'.YSBH=A'+rtrim(ltrim(str(@I)))+'.YSBH_Hide'
end
set @I=@I+1
fetch next from SQL_Cursor into @tmp_str
end
close SQL_Cursor
deallocate SQL_Cursor
--execute('drop table #MytempTable')
Print @SQL_str
--execute(@SQL_str)

end
-------------------------------------------------------------------------------
在查詢分析器裡面執行提示錯誤
Invalid object name '#MytempTable'.
A cursor with the name 'SQL_Cursor' does not exist.

我在前面已經用execute('select convert(varchar(300),'''') as Field1 into #MytempTable')創建臨時表了,怎麼還會提示Invalid object name '#MytempTable'.
第二個錯誤也類似,為什麼會出現這樣的錯誤?這樣的錯誤該怎麼解決
 
在存储过程中用Exec('Select * into #temp From ....')建立的临时表只在Exec()中存在,当Exec()结束,该临时表就被删除,所以你会跳出临时表不存在的错误。
直接
Select convert(varchar(300),'') as Field1 into #MytempTable
 
因为你的#MytempTable是局部零时表,当execute('select convert(varchar(300),'''') as Field1 into #MytempTable')执行完就会自动销毁,所有在其他地方再使用时就出现“Invalid object name '#MytempTable'”这个错误。
你把#MytempTable改成全局零时表##MytempTable就行了。
 
謝謝樓上兩位,有點明白了
改過來後還是有點問題
提示這個錯誤
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ')'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ')'.
Server: Msg 170, Level 15, State 1, Line 1
Line 1: Incorrect syntax near ')'.
 
看提示可以知道是
execute('insert into #MytempTable (Field1)values('+@SQL_str+')');
出错,这句改为下句试试
execute('insert into #MytempTable (Field1) values(' + @SQL_str + ')');
再不行就定义个字符串变量@str,把SQL语句赋给它,
用Select @str来查看该SQL语句是否有问题,再用exec执行。


 
仔细分析了一下你的代码,其实你也不需要用全局零时表,你把#MyTempTable的相关三句代码改为如下:
..........
select convert(varchar(300),'') as Field1 into #MytempTable --創建臨時表,存放sql語句
declare SQL_Cursor cursor for select Field1 from #MytempTable
........
insert into #MytempTable(Field1) values(@SQL_str)
..............
再试试。
 
前面的問題在各位的幫助下已經解決了

print @DDType--這裡可以顯示內容
if (@SQL_str='')
set @SQL_str='sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' and DDLX='''+@DDType+''' then DDJE else NULL end) as '+@CLMC+'|'+@DDCMC+'|'+@DDType
else
set @SQL_str=@SQL_str+',sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' and DDLX='''+@DDType+''' then DDJE else NULL end) as '+@CLMC+'|'+@DDCMC+'|'+@DDType
print @SQL_str--這裡怎麼就不顯示內容

怎麼print @SQL_str顯示出來的@SQL_str的值為空的
 
你把declare SQL_Cursor cursor for select Field1 from #MytempTable这句放在
open SQL_Cursor
fetch next from SQL_Cursor into @tmp_str之前再试试。
 
我現在已經將declare SQL_Cursor cursor for select Field1 from #MytempTable这句放在open SQL_Cursor
fetch next from SQL_Cursor into @tmp_str之前

在這裡顯示出來的@tmp_str隻有一個'(分號)

前面的print @sql_str基本上可以說是不執行的,將這一句改為print '##'+@SQL_str+'##'
什麼都沒顯示,就顯示空一行
 
if (@SQL_str='')
select @SQL_str=@SQL_str+'sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' and DDLX='''+@DDType+''' then DDJE else NULL end) as '+@CLMC+'|'+@DDCMC+'|'+@DDType from 你的表名 /*没有表名*/
 
可能是你开始的时候 @SQL_str没有赋值,为NULL,导致运算后的结果也为空,导致插入#MytempTable的语句为null,所有结果就。。。
你在declare @SQL_str varchar(8000)
declare @tmp_str varchar(300)后加上:
Select @SQL_str='',@tmp_str=''这句试试。
 
to:TYZhang
加上這句還是一樣,我在前面用set @SQL_str=''先賦值也一樣

to:dez_06
我不是要進行查詢,我隻要得到一串字符串就行了
查詢的在後面臨時表的遊標那就有
 
to stuwe;
你跟踪一下代码,多加几个Print,Select等,看看@SQL_str的生产过程对不对,插入到#MyTempTable中对不对,Select * from #MyTempTable看看有无记录,再查一下最后的@SQL_str的生成对不对。
我这没你的环境,没法帮你调试。
 
謝謝樓上的幾位!
在最外層的循環中,得到一條sql語句(@strSQL),存入到臨時表裡面,但在循環第二層的時候,如果沒有循環第三層(不存在電鍍類型)時,@strSQL就正常,如果循環第三層(存在電鍍類型)的話@strSQL的值自動給清空了,是什麼回事呢?
我在前面用print將結果顯示出來,測試了多遍

下面是新改過來的代碼,現在的問題就在這段代碼中
--------------------------------------------------------------------------
fetch next from CL_Cursor into @CLMC
while (@@fetch_status=0)
begin
set @I=@I+1
fetch absolute 1 from DDCMC_Cursor into @DDCMC
while (@@fetch_status=0)
begin
if exists(select distinct DDLX from DDFYZLB_temp_view where DDLX is not NULL and CLMC=@CLMC)
begin--存在電鍍類型
declare DDType_Cursor cursor
for
select distinct DDLX from DDFYZLB_temp_view where CLMC=@CLMC
open DDType_Cursor
fetch next from DDType_Cursor into @DDType
while (@@fetch_status=0)
begin --第二次循環到這裡的時候@strSQL的值又變為空了,
if (ltrim(rtrim(@strSQL))='')or(@strSQL is NULL)
set @strSQL='sum(case when CLMC='''+replace(@CLMC,'''','''''')+''' and DDCMC='''+@DDCMC+''' and DDLX='''+@DDType+''' then DDJE else NULL end) as '''+@CLMC+'|'+@DDCMC+'|'+@DDType+''''
else
set @strSQL=@strSQL+',sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' and DDLX='''+@DDType+''' then DDJE else NULL end) as '''+@CLMC+'|'+@DDCMC+'|'+@DDType+''''
fetch next from DDType_Cursor into @DDType
end
close DDType_Cursor
deallocate DDType_Cursor
end
else
begin --不存在電鍍類型
if (ltrim(rtrim(@strSQL))='')or(@strSQL is NULL)
set @strSQL='sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' then DDJE else NULL end) as '''+@CLMC+'|'+@DDCMC+''''
else
set @strSQL=@strSQL+',sum(case when CLMC='''+@CLMC+''' and DDCMC='''+@DDCMC+''' then DDJE else NULL end) as '''+@CLMC+'|'+@DDCMC+''''
end
fetch next from DDCMC_Cursor into @DDCMC
end

insert into #MytempTable(AutoID,Field1)values(@I,@strSQL)
print @strSQL
set @strSQL=''
fetch next from CL_Cursor into @CLMC
end
 
你在第三层循环中使用了三个变量@CLMC、@DDCMC、@DDType,如果其中只要有一个为null,那么你就得不到@strSQL得结果,所以你要使用:Isnull(@CLMC,'NULL')等来替换原先得@CLMC等。
 
這些代碼總看上去別扭!
 
多人接受答案了。
 
后退
顶部