这个查询为什么不返回结果,只返回受影响的行数

zhoujin96 2012-10-10 04:09:31
USE [1112b]
GO
declare @in_kemu nvarchar(10)
set @in_kemu = '语文'





--这个大段是生成临时表
declare @QueryString nvarchar(500)

declare @kemu nvarchar(10)


set @kemu =@in_kemu --设置需传入动态语句的参数的值为@kemu


set @QueryString ='SELECT '+@kemu+' as 科目,
[ROW_NUMBER] = ROW_NUMBER() OVER(ORDER BY '+@kemu+' DESC),
[DENSE_RANK] = DENSE_RANK() OVER(ORDER BY '+@kemu+' DESC),
[PERCENT] = (ROW_NUMBER() OVER(ORDER BY '+@kemu+' DESC))*1./(SELECT COUNT(1) FROM scores_xx where 年级 ='+'1'+')
into #biaozhunfen
FROM scores_xx
where 年级 = '+'1'

exec (@QueryString) --请注意参数的顺序

--生成临时表结束

--在临时表中执行查询
declare @QueryString2 nvarchar(500)

declare @kemu2 nvarchar(10)

set @QueryString2 = 'SELECT TOP 1 '+@kemu2+' FROM
(
SELECT * FROM #biaozhunfen T1
WHERE NOT EXISTS
(SELECT 1 FROM #biaozhunfen WHERE [DENSE_RANK] = T1.[DENSE_RANK] AND [ROW_NUMBER] > T1.[ROW_NUMBER])
) AS A
ORDER BY ABS([PERCENT]-0.8)'
set @kemu2 =@in_kemu --设置需传入动态语句的参数的值为@kemu

exec (@QueryString2) --请注意参数的顺序
...全文
250 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cakecc 2012-10-13
  • 打赏
  • 举报
回复
#号开头的临时表,只存在于当前会员,你在使用exec的时候,生成了一个新的会话,当执行完exec的时候,这个会话关闭,对应的临时表也被销毁,所以你重新调用的时候就没有了。
你可以提前定义你的这个临时表,然后在exec里面不用select ... into ,用insert into ...就可以了


[Quote=引用 12 楼 的回复:]

已经搞定了,但是不知道是什么原因,求解:
1、用#biaozhunfen作为临时表居然不行,必须得用tempdb.dbo.biaozhunfen
2、给@kemu2赋值语句要提前
引用 11 楼 的回复:

你在 set @QueryString2 的時候 @kemu2 是沒有賦過值的,導致 set @QueryString2 的時候變成NULL , 所以里面的語句是沒有被執行.
……
[/Quote]
我腫了 2012-10-11
  • 打赏
  • 举报
回复
你在 set @QueryString2 的時候 @kemu2 是沒有賦過值的,導致 set @QueryString2 的時候變成NULL , 所以里面的語句是沒有被執行.
zhoujin96 2012-10-11
  • 打赏
  • 举报
回复
这样的话会报错:必须声明标量变量 "@in_kemu"。[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

SQL code
USE [1112b]
GO
declare @in_kemu nvarchar(10)
set @in_kemu = '语文'





--这个大段是生成临时表
declare @QueryString nvarchar(500)

declare @kemu nvarchar(10)


set @kemu ……
[/Quote]
kate_1988 2012-10-11
  • 打赏
  • 举报
回复
问题可能出现在临时表上。把#biaozhunfen改成tempdb.dbo.biaozhunfen 试试?
我腫了 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

SQL code
USE [1112b]
GO
declare @in_kemu nvarchar(10)
set @in_kemu = '语文'





--这个大段是生成临时表
declare @QueryString nvarchar(500)

declare @kemu nvarchar(10)


set @kemu =@in_kemu --设置需传入动态语句的参数的值为@ke……
[/Quote]
set @kemu2 =@in_kemu 放在 set @QueryString2 = 'SELECT TOP 1 '+@kemu2+ ...... 前面
我腫了 2012-10-11
  • 打赏
  • 举报
回复
USE [1112b]
GO
declare @in_kemu nvarchar(10)
set @in_kemu = '语文'





--这个大段是生成临时表
declare @QueryString nvarchar(500)

declare @kemu nvarchar(10)


set @kemu =@in_kemu --设置需传入动态语句的参数的值为@kemu


set @QueryString ='SELECT '+@kemu+' as 科目,
[ROW_NUMBER] = ROW_NUMBER() OVER(ORDER BY '+@kemu+' DESC),
[DENSE_RANK] = DENSE_RANK() OVER(ORDER BY '+@kemu+' DESC),
[PERCENT] = (ROW_NUMBER() OVER(ORDER BY '+@kemu+' DESC))*1./(SELECT COUNT(1) FROM scores_xx where 年级 ='+'1'+')
into #biaozhunfen
FROM scores_xx
where 年级 = '+'1'

exec (@QueryString) --请注意参数的顺序

--生成临时表结束

--在临时表中执行查询
declare @QueryString2 nvarchar(500)

declare @kemu2 nvarchar(10)

/******放前面獲取參數值******/

set @kemu2 =@in_kemu --设置需传入动态语句的参数的值为@kemu

/******置后******/
set @QueryString2 = 'SELECT TOP 1 '+@kemu2+' FROM
(
SELECT * FROM #biaozhunfen T1
WHERE NOT EXISTS
(SELECT 1 FROM #biaozhunfen WHERE [DENSE_RANK] = T1.[DENSE_RANK] AND [ROW_NUMBER] > T1.[ROW_NUMBER])
) AS A
ORDER BY ABS([PERCENT]-0.8)'

exec (@QueryString2) --请注意参数的顺序

請看紅色部份
zhoujin96 2012-10-11
  • 打赏
  • 举报
回复
奇怪了,仍然不返回结果,只返回受影响的行数。[Quote=引用 5 楼 的回复:]

SQL code

USE [1112b]
GO
declare @in_kemu nvarchar(10)
set @in_kemu = '语文'

--这个大段是生成临时表
declare @QueryString nvarchar(500)
declare @kemu nvarchar(10)


set @kemu =@in_kemu --设置需传入动态语句的参数的值为@kemu

……
[/Quote]
我腫了 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

已经搞定了,但是不知道是什么原因,求解:
1、用#biaozhunfen作为临时表居然不行,必须得用tempdb.dbo.biaozhunfen
2、给@kemu2赋值语句要提前
引用 11 楼 的回复:

你在 set @QueryString2 的時候 @kemu2 是沒有賦過值的,導致 set @QueryString2 的時候變成NULL , 所以里面的語句是沒有被執行.
……
[/Quote]
問題1,
使用全局臨時表就行了 # 變成 ##
不是全局臨時表的話 會在該訪問完成后自動刪除
feisheng512 2012-10-11
  • 打赏
  • 举报
回复
set @kemu2 =@in_kemu --设置需传入动态语句的参数的值为@kemu
这一句的问题,需要提前设置
下面是测试 你看看

declare @in_kemu nvarchar(10)
set @in_kemu = '语文'


--在临时表中执行查询
declare @QueryString2 nvarchar(500)

declare @kemu2 nvarchar(10)
--提前设置@kemu2 的值
set @kemu2 =@in_kemu --设置需传入动态语句的参数的值为@kemu

set @QueryString2 = 'SELECT TOP 1 '+@kemu2+' FROM
(
SELECT * FROM #biaozhunfen T1
WHERE NOT EXISTS
(SELECT 1 FROM #biaozhunfen WHERE [DENSE_RANK] = T1.[DENSE_RANK] AND [ROW_NUMBER] > T1.[ROW_NUMBER])
) AS A
ORDER BY ABS([PERCENT]-0.8)'
--set @kemu2 =@in_kemu --设置需传入动态语句的参数的值为@kemu
PRINT (@QueryString2)
--exec (@QueryString2) --请注意参数的顺序
zhoujin96 2012-10-11
  • 打赏
  • 举报
回复
已经搞定了,但是不知道是什么原因,求解:
1、用#biaozhunfen作为临时表居然不行,必须得用tempdb.dbo.biaozhunfen
2、给@kemu2赋值语句要提前
[Quote=引用 11 楼 的回复:]

你在 set @QueryString2 的時候 @kemu2 是沒有賦過值的,導致 set @QueryString2 的時候變成NULL , 所以里面的語句是沒有被執行.
[/Quote]
DBA_磊仔 2012-10-10
  • 打赏
  • 举报
回复

USE [1112b]
GO
declare @in_kemu nvarchar(10)
set @in_kemu = '语文'

--这个大段是生成临时表
declare @QueryString nvarchar(500)
declare @kemu nvarchar(10)


set @kemu =@in_kemu --设置需传入动态语句的参数的值为@kemu

create table #biaozhunfen(科目 nvarchar(10),[ROW_NUMBER] int,[DENSE_RANK] int, [PERCENT] float)
set @QueryString ='SELECT '+@kemu+' ,
ROW_NUMBER() OVER(ORDER BY '+@kemu+' DESC),
DENSE_RANK() OVER(ORDER BY '+@kemu+' DESC),
(ROW_NUMBER() OVER(ORDER BY '+@kemu+' DESC))*1./(SELECT COUNT(1) FROM scores_xx where 年级 ='+'1'+')
FROM scores_xx
where 年级 = '+'1'
insert into #biaozhunfen
exec (@QueryString) --请注意参数的顺序

--生成临时表结束

--在临时表中执行查询
declare @QueryString2 nvarchar(500)

declare @kemu2 nvarchar(10)

set @QueryString2 = 'SELECT TOP 1 '+@kemu2+' FROM
(
SELECT * FROM #biaozhunfen T1
WHERE NOT EXISTS
(SELECT 1 FROM #biaozhunfen WHERE [DENSE_RANK] = T1.[DENSE_RANK] AND [ROW_NUMBER] > T1.[ROW_NUMBER])
) AS A
ORDER BY ABS([PERCENT]-0.8)'
set @kemu2 =@in_kemu --设置需传入动态语句的参数的值为@kemu

exec (@QueryString2) --请注意参数的顺序
LongRui888 2012-10-10
  • 打赏
  • 举报
回复
我试了一下下面的语句:

exec ('select * into #abc123 from sys.objects')


exec('select * from #abc123')

运行结果:

(55 行受影响)
消息 208,级别 16,状态 0,第 1 行
对象名 '#abc123' 无效。

从上面的运行结果看出,调用exec执行,所产生的临时表的有效期只是在执行期间,exec执行完成后这个临时表自动释放,就不存在了,所以就导致第二exec语句执行报错,找不到对象名。
zhoujin96 2012-10-10
  • 打赏
  • 举报
回复
不能出数据,还是和 exec (@QueryString2)一样[Quote=引用 2 楼 的回复:]

你先把exec (@QueryString2) --请注意参数的顺序 这里协程print @QueryString2,看看得出来的语句能不能出数据
[/Quote]
發糞塗牆 2012-10-10
  • 打赏
  • 举报
回复
你先把exec (@QueryString2) --请注意参数的顺序 这里协程print @QueryString2,看看得出来的语句能不能出数据
haitao 2012-10-10
  • 打赏
  • 举报
回复
exec (@QueryString2)前print @QueryString2一下,看看@QueryString2是内容
通过该课程的学习,掌握0行代码写服务框架的服务发布,参数验证,代码生成功能,具备初步的使用能力 该项目本身设计的内容非常多,后期会逐步开放讲解框架后期内容参考:https://mp.csdn.net/editor/html/112142371与Springboot+mybatis和Springboot+jdbctemplate对比:https://editor.csdn.net/md/?articleId=106091083框架主要功能:生成自定义sql模板文件1.一键生成数据库所有列表增、删、改、查接口通过代码生成器,一键生成增、删、改、查代码,分为有代码和无代码两种方式。有代码方式可以在需要业务封装时直接调用生成的代码进行业务组装。有代码方式和无代码方式都可以直接调用访问。2.可指定单表生成接口可以指定生成那张表的数据接口,以免对已有接口造成影响。3.一键生成接口测试postman调用文件生成postman调用接口,直接导入即可测试,不需要单独也写接口文档,也不需要使用swangger在代码中单独增加注释。字段长度类型,大小一目了然。4.可生成controller、service、dao、model、自定义sql、postman测试文件可以根据实际需要进行单独配置5.接口任意参数可自动配置多维度验证比如一个参数phone,在不需要编程的情况下,可以配置验证是否为空、长度、是否是电话号码6.数据接口可以任意组合形成新的接口比如、查询学校是一个接口、查询城市是一个接口,通常情况下在前端是需要两次请求,现在可以通过一次请求自动合并两个接口的数据结果,一次性返回。而这样的组合可以是无限个组合。7.所有接口参数均可自动封装比如查询省份接口,里面有10个参数,前端传入几个参数,便可自动封装几个参数。8.所有查询接口自带分页列表查询,有码方式和无码方式,均自带分页。9.通过简单sql的编辑即可完成服务发布只要会写sql便可生成服务,不需要任何多余操作10.接口可以进行限流配置,可以根据ip、token、ak进行限流操作多维度自定义限流,可设置次数、时限、限流方式11.所有接口可以进行签名认证所有接口通过接口sign签名认证12.所有接口可以进行登录认证限制,也可单独配置不需要登录认证可以指定接口单独授权不需要登录验证,比如验证码接口13.所有接口均可设置需要验证码验证所有的接口都可以通过参数配置设置短信验证码和图片验证码14.所有查询接口均可单独设置缓存所有接口皆可设置单独缓存,缓存周期15.所有接口均可监控访问次数同一接口访问次数记录,很容易监控服务访问,可以做更细致的服务优化16.所有接口均可记录访问日志,包括请求来源请求参数、获得结果入参出参所有访问皆有详细记录17.项目中的代码可以进行自动统计代码量一键统计代码量,包括前后端代码行数和体积18.可以自动进行数据统计,可配置单表数据量统计、也可以配置定时任务数据统计自动表数据统计,方便做BI可视化报表,不需要开发直接配置即可19.可进行跨域设置跨域通过配置文件配置20.可进行IP禁用对于恶意访问ip进行封禁21.可进行访问次数限制所有接口可以进行访问次数限制22.可进行访问来源设备、应用检查验证验证请求来源所用设备和请求发起的应用

34,593

社区成员

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

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