print 没有结果

wzsjzjjxy 2011-06-12 02:07:48
下面语句 为什么我print没有结果啊?

DECLARE @WHSCODE VARCHAR(20),@ITEMCODE VARCHAR(30),@Codebars varchar(30),@datefrom datetime,@dateto datetime
SET @DATEFROM='2010-01-01'
SET @DATETO='2011-01-01'
SET @WHSCODE='1-AZJT01'
SET @ITEMCODE='A'
declare @sql nvarchar(4000)
set @sql='s'
declare @cur varchar(4000) --保存动态游标语句,实现物料模糊查询
declare @type nvarchar(4)
set @cur=N'
declare cur1 cursor for --获取型号列值,作为分组依据
select distinct m.型号
from
(SELECT tt.DocDate,tt.DocEntry, tt.DocNum, tt.Comments,d.ItemCode,d.Quantity,left(T4.[BatchNum],3) AS COLORCODE
,SUBSTRING(T4.[BatchNum],4,2) AS ''型号'',d.WhsCode,tt.U_DJLX,tt.U_JYLX,d.LineTotal,D.ObjType,D.LineNum
FROM dbo.OIGN AS tt
INNER JOIN dbo.IGN1 AS d ON tt.DocEntry = d.DocEntry AND tt.CurSource = ''C''
inner join ibt1 T4 ON T4.BaseType = D.ObjType AND D.DocEntry=T4.BaseEntry AND D.LineNum=t4.BaseLinNum
where isnull(SUBSTRING(T4.[BatchNum],4,2),'''')<>'''' and tt.docdate between '
+convert(varchar(20),@datefrom,112)+N' and '''+convert(varchar(20),@dateto,112)
+N''') M
left join OITM p on p.ITEMCODE=m.itemcode
inner join owhs t5 on M.whscode = t5.whscode
where M.whscode ='+@whscode+N' and M.ItemCode like '''+@itemcode+N'%'''+N'

open cur1

fetch next from cur1 into '+@type+'
while @@fetch_status=0
begin
set @sql='+@sql+'['+@type+'],'+'
fetch next from cur1 into '+@type+'
end
set @sql=stuff('+@sql+',1,1,'''')
set '+@sql+'=left('+@SQL+',len('+@SQL+')-1)
close cur1
deallocate cur1'

PRINT @cur


为什么我print后没有结果啊?
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawogui 2011-06-12
  • 打赏
  • 举报
回复
其实,很多错误都是在很一般的语句里.
wzsjzjjxy 2011-06-12
  • 打赏
  • 举报
回复
谢谢,找到原因了,一下午头都大了,看来自己还有很多不懂的啊。[Quote=引用 2 楼 maco_wang 的回复:]

不知道你的数据情况,不知道你的表结构,貌似不好判断
[/Quote]
xiaoliaoyun 2011-06-12
  • 打赏
  • 举报
回复
是不是SELECT DISTINCT M.型号 有NULL 值?
加上这个条件 AND M.型号 IS NOT NULL

WHERE M.whscode =@WHSCODE
AND M.ItemCode LIKE '' + @ITEMCODE + '%' AND M.docdate BETWEEN @DATEFROM AND @DATETO
AND M.型号 IS NOT NULL



[Quote=引用 7 楼 wzsjzjjxy 的回复:]
我单独执行select distinct M.型号 这个select 是没问题的。

引用 5 楼 xiaoliaoyun 的回复:

可以不用动态SQL,可以这样 LIKE '' + @ITEMCODE + '%'
没有表和数据,无法测试.如果有问题自己稍微修改下
SQL code

DECLARE @WHSCODE VARCHAR(20)
,@ITEMCODE VARCHAR……
[/Quote]
wzsjzjjxy 2011-06-12
  • 打赏
  • 举报
回复
我单独执行select distinct M.型号 这个select 是没问题的。[Quote=引用 5 楼 xiaoliaoyun 的回复:]

可以不用动态SQL,可以这样 LIKE '' + @ITEMCODE + '%'
没有表和数据,无法测试.如果有问题自己稍微修改下
SQL code

DECLARE @WHSCODE VARCHAR(20)
,@ITEMCODE VARCHAR(30)
,@Codebars VARCHAR(30)
,@datefrom DATE……
[/Quote]
wzsjzjjxy 2011-06-12
  • 打赏
  • 举报
回复
谢谢你的回答,但是现在有个问题,提示传递到 SUBSTRING 函数的长度参数无效。

ALTER PROC TEST3
@WHSCODE VARCHAR(20),@ITEMCODE VARCHAR(30),@Codebars varchar(30),@datefrom datetime,@dateto datetime
AS
BEGIN
DECLARE @SQL NVARCHAR(4000)
,@type NVARCHAR(4)

DECLARE CUR1 CURSOR FOR --获取型号列值,作为分组依据
SELECT DISTINCT M.型号
FROM
(
SELECT TT.DOCDATE,d.ItemCode
,d.WhsCode
,SUBSTRING(T4.[BatchNum],4,2) AS '型号'
FROM dbo.OIGN AS tt
INNER JOIN dbo.IGN1 AS d ON tt.DocEntry = d.DocEntry AND tt.CurSource = 'C'
INNER JOIN ibt1 T4 ON T4.BaseType = D.ObjType AND D.DocEntry=T4.BaseEntry AND D.LineNum=t4.BaseLinNum
WHERE ISNULL(SUBSTRING(T4.[BatchNum],4,2),'')<>'') M
LEFT JOIN OITM P on P.ITEMCODE = M.itemcode
INNER JOIN owhs T5 on M.whscode = T5.whscode
WHERE M.whscode =@WHSCODE
AND M.ItemCode LIKE '' + @ITEMCODE + '%' AND M.docdate BETWEEN @DATEFROM AND @DATETO

OPEN CUR1
FETCH NEXT FROM CUR1 INTO @type
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql= @sql + ',[' + @type + ']'
FETCH NEXT FROM CUR1 INTO @type
END

SET @sql = STUFF(@sql,1,1,'')
set @sql=left(@SQL,len(@SQL)-1)
CLOSE CUR1
DEALLOCATE CUR1

PRINT @sql

END
-- exec test '1-ASCK01','A','','2010-01-01','2011-01-31'

[Quote=引用 5 楼 xiaoliaoyun 的回复:]

可以不用动态SQL,可以这样 LIKE '' + @ITEMCODE + '%'
没有表和数据,无法测试.如果有问题自己稍微修改下
SQL code

DECLARE @WHSCODE VARCHAR(20)
,@ITEMCODE VARCHAR(30)
,@Codebars VARCHAR(30)
,@datefrom DATE……
[/Quote]
xiaoliaoyun 2011-06-12
  • 打赏
  • 举报
回复
可以不用动态SQL,可以这样 LIKE '' + @ITEMCODE + '%'
没有表和数据,无法测试.如果有问题自己稍微修改下

DECLARE @WHSCODE VARCHAR(20)
,@ITEMCODE VARCHAR(30)
,@Codebars VARCHAR(30)
,@datefrom DATETIME
,@dateto DATETIME
,@SQL NVARCHAR(4000)
,@type NVARCHAR(4)

SET @DATEFROM='2010-01-01'
SET @DATETO='2011-01-01'
SET @WHSCODE='1-AZJT01'
SET @ITEMCODE='A'
SET @SQL = ''

DECLARE CUR1 CURSOR FOR --获取型号列值,作为分组依据
SELECT DISTINCT M.型号
FROM
(
SELECT d.ItemCode
,d.WhsCode
,SUBSTRING(T4.[BatchNum],4,2) AS '型号'
FROM dbo.OIGN AS tt
INNER JOIN dbo.IGN1 AS d ON tt.DocEntry = d.DocEntry AND tt.CurSource = 'C'
INNER JOIN ibt1 T4 ON T4.BaseType = D.ObjType AND D.DocEntry=T4.BaseEntry AND D.LineNum=t4.BaseLinNum
WHERE ISNULL(SUBSTRING(T4.[BatchNum],4,2),'')<>'' AND tt.docdate BETWEEN @DATEFROM AND @DATETO
) M
LEFT JOIN OITM P on P.ITEMCODE = M.itemcode
INNER JOIN owhs T5 on M.whscode = T5.whscode
WHERE M.whscode =@WHSCODE
AND M.ItemCode LIKE '' + @ITEMCODE + '%'

OPEN CUR1
FETCH NEXT FROM CUR1 INTO @type
WHILE @@FETCH_STATUS=0
BEGIN
SET @sql= @sql + ',[' + @type + ']'
FETCH NEXT FROM CUR1 INTO @type
END

SET @sql = STUFF(@sql,1,1,'')
CLOSE CUR1
DEALLOCATE CUR1

SELECT @sql
wzsjzjjxy 2011-06-12
  • 打赏
  • 举报
回复
你说的对,这里涉及到的变量只要一个没有赋值就会没有结果,但是哪个@type变量我是用在游标中的,不可能赋值的。我的目的是根据过程传入的参数,将参数作为select 的条件(where itemcode=@itemcode 没问题,但是我想用like 就有问题了,where itemcode like @itemcode 是不行的,所以要用动态语句)
将select 语句作为游标取值来源,这样就有问题了。
[Quote=引用 3 楼 xiaoliaoyun 的回复:]

因为你的@type 没有赋值
SQL code

SET @type = ''
[/Quote]
xiaoliaoyun 2011-06-12
  • 打赏
  • 举报
回复
因为你的@type 没有赋值

SET @type = ''
叶子 2011-06-12
  • 打赏
  • 举报
回复
不知道你的数据情况,不知道你的表结构,貌似不好判断
-晴天 2011-06-12
  • 打赏
  • 举报
回复
检查你的查询语句里的连接和条件是否正确.
没有你的表结构和数据,无法作出进一步的判断.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧