2次使用动态SQL

vbsnake 2005-04-07 03:28:38
DECLARE @SQL VARCHAR(8000)
DECLARE @ESQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL= @SQL+ ','+quotename(B.NAME,'''')+'=isnull(sum(CASE CODE when '+quotename(A.CODE,'''')+' THEN NQTY END),0)'
FROM T A(NOLOCK),Codename B(NOLOCK) WHERE A.CODE = B.CODE GROUP BY A.CODE,B.NAME
Set @ESQL = '
SELECT P.DEPT,P.PKG,P.LOT'+@SQL+' FROM (
SELECT * FROM (
select DEPT,PKG,LOT'+@SQL+',TOTAL=sum(NQTY) from T(NOLOCK)
Group by DEPT,PKG,LOT with rollup
) G LEFT OUTER JOIN (SELECT LOT AS HLOT,LOTNAME,STOCK1,STOCK2,STOCK3,STOCK4,STOCK5
FROM T(NOLOCK) WHERE ) H ON G.LOT=H.HLOT ) P '
Exec(@ESQL)

问题出现在‘SELECT P.DEPT,P.PKG,P.LOT'+@SQL+' FROM (’
错误消息是
Server: Msg 207, Level 16, State 3, Line 2
Invalid column name 'NQTY'.
Server: Msg 207, Level 16, State 1, Line 2
Invalid column name 'CODE'.
怎么办呢?
...全文
239 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2005-04-07
  • 打赏
  • 举报
回复
DECLARE @SQL VARCHAR(8000)
DECLARE @ESQL VARCHAR(8000)
DECLARE @S VARCHAR(8000)

SELECT @SQL='',@s=''
SELECT @SQL= @SQL+ ','+quotename(B.NAME,'''')
+'=isnull(sum(CASE CODE when '+quotename(A.CODE,'''')
+' THEN NQTY END),0)',
@s=@s+',g.'+quotename(B.NAME,'''')
FROM T A(NOLOCK),Codename B(NOLOCK)
WHERE A.CODE = B.CODE
GROUP BY A.CODE,B.NAME
Set @ESQL = '
SELECT P.DEPT,P.PKG,P.LOT'+@s+' FROM (
SELECT * FROM (
select DEPT,PKG,LOT'+@SQL+',TOTAL=sum(NQTY)
from T(NOLOCK)
Group by DEPT,PKG,LOT with rollup
) G
LEFT OUTER JOIN (
SELECT LOT AS HLOT,LOTNAME,STOCK1,STOCK2,STOCK3,STOCK4,STOCK5
FROM T(NOLOCK) WHERE 1=1 --*************这里的条件也不对
) H ON G.LOT=H.HLOT
P '
Exec(@ESQL)

zjcxc 元老 2005-04-07
  • 打赏
  • 举报
回复
--改成这样:

DECLARE @SQL VARCHAR(8000)
DECLARE @ESQL VARCHAR(8000)
DECLARE @S VARCHAR(8000)

SELECT @SQL='',@s=''
SELECT @SQL= @SQL+ ','+quotename(B.NAME,'''')
+'=isnull(sum(CASE CODE when '+quotename(A.CODE,'''')
+' THEN NQTY END),0)',
@s=@s+',g.'+quotename(B.NAME,'''')
FROM T A(NOLOCK),Codename B(NOLOCK)
WHERE A.CODE = B.CODE
GROUP BY A.CODE,B.NAME
Set @ESQL = '
SELECT P.DEPT,P.PKG,P.LOT'+@s+' FROM (
SELECT * FROM (
select DEPT,PKG,LOT'+@SQL+',TOTAL=sum(NQTY)
from T(NOLOCK)
Group by DEPT,PKG,LOT with rollup
) G
LEFT OUTER JOIN (
SELECT LOT AS HLOT,LOTNAME,STOCK1,STOCK2,STOCK3,STOCK4,STOCK5
FROM T(NOLOCK) WHERE
) H ON G.LOT=H.HLOT
P '
Exec(@ESQL)

zjcxc 元老 2005-04-07
  • 打赏
  • 举报
回复
错误提示已经很清楚了。
ITpassport 2005-04-07
  • 打赏
  • 举报
回复
SET @SQL1=''
SELECT @SQL1= @SQL1+ ','+quotename(B.NAME,'''')+''
应该是
SET @SQL1=''
SELECT @SQL1= @SQL1+ ','+quotename(B.NAME,'')+''
子陌红尘 2005-04-07
  • 打赏
  • 举报
回复
TRY:
-----------------------------------------------------------
DECLARE @SQL1 VARCHAR(8000)
DECLARE @SQL2 VARCHAR(8000)
DECLARE @ESQL VARCHAR(8000)

SET @SQL1=''
SELECT @SQL1= @SQL1+ ','+quotename(B.NAME,'''')+''
FROM T A(NOLOCK),Codename B(NOLOCK) WHERE A.CODE = B.CODE GROUP BY A.CODE,B.NAME

SET @SQL2=''
SELECT @SQL2= @SQL2+ ','+quotename(B.NAME,'''')+'=isnull(sum(CASE CODE when '+quotename(A.CODE,'''')+' THEN NQTY END),0)'
FROM T A(NOLOCK),Codename B(NOLOCK) WHERE A.CODE = B.CODE GROUP BY A.CODE,B.NAME

Set @ESQL = '
SELECT P.DEPT,P.PKG,P.LOT'+@SQL1+' FROM (
SELECT * FROM (
SELECT DEPT,PKG,LOT'+@SQL2+',TOTAL=sum(NQTY) from T(NOLOCK)
Group by DEPT,PKG,LOT with rollup ) G
LEFT OUTER JOIN
(SELECT LOT AS HLOT,LOTNAME,STOCK1,STOCK2,STOCK3,STOCK4,STOCK5 FROM T(NOLOCK) WHERE ) H
ON G.LOT=H.HLOT ) P '
Exec(@ESQL)
子陌红尘 2005-04-07
  • 打赏
  • 举报
回复
很显然,
SELECT * FROM
(select DEPT,PKG,LOT'+@SQL+',TOTAL=sum(NQTY) from T(NOLOCK)
Group by DEPT,PKG,LOT with rollup ) G
LEFT OUTER JOIN
(SELECT LOT AS HLOT,LOTNAME,STOCK1,STOCK2,STOCK3,STOCK4,STOCK5
FROM T(NOLOCK) WHERE ) H
ON
G.LOT=H.HLOT

返回的结果集中已经没有了 NQTY和CODE字段
wyb0026 2005-04-07
  • 打赏
  • 举报
回复
@ESQL的语法不正确如果可能把表结构贴出来看一下

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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