sqlserver 动态sql cast出错

如下红色部分为什么转换老是出错,我写成定值可以,写成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

长风秋雁
浏览 538回答 5
5回答

慕斯王

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

UYOU

这个不一定~我昨晚测试了下不加长度的话CAST是正确的~ 还是建议他把PRINT @sql输出后在分析比较稳妥~

元芳怎么了

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

饮歌长啸

@顾晓北: 这下面的语句没有加 nvarchar(n) 都可以得出结果的.LZ的问题可能比较复杂了.  USE mastergoDECLARE @sql nvarchar(500)DECLARE @i intSET @i = 9SET @sql = 'SELECT TOP (' + CAST((@i + 100) AS nvarchar) + ') * FROM sys.all_objects'PRINT @sqlEXEC sp_executesql @sql
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server