【发布时间】:2014-02-13 05:06:09
【问题描述】:
我们在 SqlServer 数据库上有以下存储过程。它适用于早期版本。但它不适用于最新版本(SqlServer Express 2012)。该过程编译良好。但是运行时会抛出错误信息。
我对在 SqlServer 上编程存储过程几乎一无所知。这是 10 多年前创建的程序,并且一直有效。 (但现在没有)。
任何想法我需要更改以纠正它?
CREATE PROCEDURE [GETBOUND] @mTableName char(20), @FIELD_NAME CHAR(20), @FIELD_VALUE CHAR(50), @DIRECTION CHAR(1), @nRec int , @ADD_COND CHAR(100) AS
declare @myresult char(50)
declare @counter numeric
declare @mDesc char(5)
declare @mEval char(2)
if @Direction = 'L' BEGIN
SELECT @mDesc = ' DESC'
SELECT @mEval = '<='
END ELSE BEGIN
SELECT @mDesc = ''
SELECT @mEval = '>='
END
exec('DECLARE THESQL CURSOR FOR SELECT '+@field_name+' FROM '+@mTableName+' WHERE '+@ADD_COND+@field_name+@mEval+''''+ @Field_Value+''' order by '+@FIELD_NAME+@mDesc)
SET ROWCOUNT @nrec
open THESQL
fetch THESQL into @myresult
select @COUNTER = 1
WHILE (@COUNTER <@nRec)
BEGIN
fetch THESQL into @myresult
SELECT @COUNTER = @COUNTER +1
END
close THESQL
deallocate THESQL
select @myresult
【问题讨论】:
-
SET ROWCOUNT现在是 SQL Server 2012 中的计划缓存键。当0为非零时(set_options中的262144),它会编译不同的计划 -
如此快速的解决方法是将
SET ROWCOUNT和exec('DECLARE THESQL的顺序颠倒过来。虽然实际上我认为这对你没有任何帮助。不过,您可能应该使用嵌套的TOP或ROW_NUMBER从头开始重写整个内容。 -
谢谢马丁。反转这些使它起作用。请把它作为一个答案,这样我就可以给你信用。
标签: sql-server sql-server-2012