为了账号安全,请及时绑定邮箱和手机立即绑定

sqlserver 动态sql cast出错

sqlserver 动态sql cast出错

长风秋雁 2018-12-07 04:22:52
如下红色部分为什么转换老是出错,我写成定值可以,写成cast(@i as nvarchar)可以,为什么写成cast((@i-1) as nvarchar)就出错呢? set @str = SUBSTRING(@context,6, 1);    set @i = CAST(SUBSTRING(@context,7, 1) as int);    if @i = 1    begin      set @sql=N'set @strnum = (select top 1 * from LuckyStation.dbo.f_splitstr('''+ rtrim(@win_code) + ''','',''))';    end     else     begin     set @sql=N'set @strnum = (select top ' + CAST(@i as nvarchar) + ' * from LuckyStation.dbo.f_splitstr('''+ rtrim(@win_code) + ''','','')     except      select top '+cast((@i-1) as nvarchar) +' * from LuckyStation.dbo.f_splitstr('''+ rtrim(@win_code) +''','',''))';    end    set @paraDefine = N'@strnum nvarchar(50) output';    exec sp_executesql @sql,@paraDefine,@strnum output
查看完整描述

5 回答

?
慕斯王

TA贡献1864条经验 获得超2个赞

楼上正确,应该是你没写长度。

查看完整回答
反对 回复 2019-01-07
?
UYOU

TA贡献1878条经验 获得超4个赞

这个不一定~我昨晚测试了下不加长度的话CAST是正确的~

还是建议他把PRINT @sql输出后在分析比较稳妥~

查看完整回答
反对 回复 2019-01-07
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

@dotNetDR_:你的那一句是要查出前(i+1)条记录是么?如果是,为什么要将(i+1)转换成nvarchar?top后面本来就该是int类型。你不转换试试看。。。

查看完整回答
反对 回复 2019-01-07
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

@顾晓北:

这下面的语句没有加 nvarchar(n) 都可以得出结果的.
LZ的问题可能比较复杂了. 

USE master
go

DECLARE @sql nvarchar(500)
DECLARE @i int

SET @i 9
SET @sql 'SELECT TOP (CAST((@i 100) AS nvarchar) ') * FROM sys.all_objects'

PRINT @sql

EXEC sp_executesql @sql
查看完整回答
反对 回复 2019-01-07
  • 5 回答
  • 0 关注
  • 537 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信