首页 新闻 赞助 找找看

sqlserver 动态sql cast出错

0
悬赏园豆:5 [已解决问题] 解决于 2011-11-30 11:27

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

soarfe的主页 soarfe | 初学一级 | 园豆:146
提问于:2011-09-10 20:57
< >
分享
最佳答案
0

你好,~那个

CAST((@i - 1) AS nvarchar)那里你改成

CAST((@i - 1) AS nvarchar(500))试试.~我以前也碰到这破问题

症状应该跟你的非常类似.

http://www.cnblogs.com/highend/archive/2010/03/13/1685099.html

收获园豆:5
dotNetDR_ | 老鸟四级 |园豆:2078 | 2011-09-11 00:24

上面回复的有问题~

这样你先把

exec sp_executesql @sql,@paraDefine,@strnum output注释

--exec sp_executesql @sql,@paraDefine,@strnum output

然后

print @sql;

然后在根据输出去调试看看那的问题.

我一般都用这个方法,很管用!

dotNetDR_ | 园豆:2078 (老鸟四级) | 2011-09-11 00:34
其他回答(1)
0

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

顾晓北 | 园豆:10844 (专家六级) | 2011-09-11 16:34

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

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

支持(0) 反对(0) dotNetDR_ | 园豆:2078 (老鸟四级) | 2011-09-11 22:03

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

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2011-09-12 08:33

@顾晓北:

这下面的语句没有加 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
支持(0) 反对(0) dotNetDR_ | 园豆:2078 (老鸟四级) | 2011-09-13 00:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册