那请各位看一下如下两个存储过程有何区别,为什么第二个在Asp.net中调用没有任何问题而在java的JDBC中调用时ResultSet会返回空,JDBC只能使用第一个不包含CAST()函数的存储过程?----------------------NO.1--------------------------CREATE PROCEDURE spAll_ReturnRows ( @SQL nVARCHAR(4000),--选择的SQL语句 @Page int,--页号 @RecsPerPage int,--返回记录数 @ID VARCHAR(255),--主键 @Sort VARCHAR(255)--排序字段,T9是表别名 ) ASdeclare @temp1 varchar(20) set @temp1=convert(varchar(20),@RecsPerPage) declare @temp2 varchar(20) set @temp2=convert(varchar(20),(@RecsPerPage*(@Page-1)))exec('select top '+@temp1+' * from ('+@SQL+')t where t.'+@ID+' not in (select top '+@temp2+' '+@ID+' from ('+@SQL+') t9 order by '+@Sort+') order by '+@Sort) GO-----------------------NO.2--------------------------CREATE PROCEDURE spAll_ReturnRows ( @SQL nVARCHAR(4000), @Page int, @RecsPerPage int, @ID VARCHAR(255), @Sort VARCHAR(255) ) ASDECLARE @Str nVARCHAR(4000)SET @Str='SELECT TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE T.'+@ID+' NOT IN (SELECT TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+') ORDER BY '+@SortPRINT @StrEXEC sp_ExecuteSql @Str GO
convert一般用于日期和时间值,小数之间转换; cast一般用于小数转数值和字符型.
使用 CONVERT:CONVERT (data_type[(length)], expression [, style])参数 expression是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见表达式。 data_type目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。 lengthnchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。 style日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。在表中,左侧的两列表示将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。 ----------------------------------- 使用 CAST: CAST ( expression AS data_type ) E 因为结果长度太短无法显示而返回错误。Microsoft SQL Server 仅保证往返转换(即,从原始数据类型进行转换后又返回原始数据类型)在各版本间产生相同值。下面的示例显示往返转换:DECLARE @myval decimal (5, 2) SET @myval = 193.57 SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5)) -- Or, using CONVERT SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))例如,不要尝试构造 binary 值并将它们转换为数字数据类型分类的数据类型。SQL Server 并不保证 decimal 或 numeric 数据类型转换为 binary 的结果在 SQL Server 各版本间相同。下面的示例显示了由于太短而无法显示的结果表达式。USE pubs SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2)) FROM titles WHERE type = 'trad_cook'下面是结果集:Title ------------------------- -- Onions, Leeks, and Garlic * Fifty Years in Buckingham * Sushi, Anyone? *
比如
select convert(varchar,getdate(),110)--118是显示方式
cast没有这种功能
不同之处:convertk只是显示转换
cast是强制转换
所以你就忘记cast把,反正convert所有地方都可以用
(
@SQL nVARCHAR(4000),--选择的SQL语句
@Page int,--页号
@RecsPerPage int,--返回记录数
@ID VARCHAR(255),--主键
@Sort VARCHAR(255)--排序字段,T9是表别名
)
ASdeclare @temp1 varchar(20)
set @temp1=convert(varchar(20),@RecsPerPage)
declare @temp2 varchar(20)
set @temp2=convert(varchar(20),(@RecsPerPage*(@Page-1)))exec('select top '+@temp1+' * from ('+@SQL+')t where t.'+@ID+' not in (select top '+@temp2+' '+@ID+' from ('+@SQL+') t9 order by '+@Sort+') order by '+@Sort)
GO-----------------------NO.2--------------------------CREATE PROCEDURE spAll_ReturnRows
(
@SQL nVARCHAR(4000),
@Page int,
@RecsPerPage int,
@ID VARCHAR(255),
@Sort VARCHAR(255)
)
ASDECLARE @Str nVARCHAR(4000)SET @Str='SELECT TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE T.'+@ID+' NOT IN
(SELECT TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+') ORDER BY '+@SortPRINT @StrEXEC sp_ExecuteSql @Str
GO
cast一般用于小数转数值和字符型.
expression是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见表达式。 data_type目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。 lengthnchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。 style日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。在表中,左侧的两列表示将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。
-----------------------------------
使用 CAST:
CAST ( expression AS data_type ) E 因为结果长度太短无法显示而返回错误。Microsoft SQL Server 仅保证往返转换(即,从原始数据类型进行转换后又返回原始数据类型)在各版本间产生相同值。下面的示例显示往返转换:DECLARE @myval decimal (5, 2)
SET @myval = 193.57
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5))
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval))例如,不要尝试构造 binary 值并将它们转换为数字数据类型分类的数据类型。SQL Server 并不保证 decimal 或 numeric 数据类型转换为 binary 的结果在 SQL Server 各版本间相同。下面的示例显示了由于太短而无法显示的结果表达式。USE pubs
SELECT SUBSTRING(title, 1, 25) AS Title, CAST(ytd_sales AS char(2))
FROM titles
WHERE type = 'trad_cook'下面是结果集:Title
------------------------- --
Onions, Leeks, and Garlic *
Fifty Years in Buckingham *
Sushi, Anyone? *
但是有时用cast更方便.
不同之处:convertk只是显示转换
cast是强制转换
cast一般用于小数转数值和字符型.