Sql server 语法问题:在存储过程中使用变量
有人能告诉我下面的代码是如何正确的吗。Iam尝试创建一个存储过程,该过程返回传递给它的表的行数Sql server 语法问题:在存储过程中使用变量,sql-server,visual-studio,sql-server-2005,stored-procedures,Sql Server,Visual Studio,Sql Server 2005,Stored Procedures,有人能告诉我下面的代码是如何正确的吗。Iam尝试创建一个存储过程,该过程返回传递给它的表的行数 CREATE PROCEDURE spROWCOUNTER ( @tablename nvarchar(20) @rowCountVal int OUTPUT ) AS DECLARE @strQuery nvarchar(300) SET @strQuery = 'SELECT @rowCountVal=COUNT(*) FROM '+@tablename EXEC(@str
CREATE PROCEDURE spROWCOUNTER
(
@tablename nvarchar(20)
@rowCountVal int OUTPUT
)
AS
DECLARE @strQuery nvarchar(300)
SET @strQuery = 'SELECT @rowCountVal=COUNT(*) FROM '+@tablename
EXEC(@strQuery)
RETURN @rowCountVal
错误消息:
- “@rowCountVal”附近的语法不正确
- 必须声明标量变量“@tablename”
- 必须声明标量变量'@rowCountVal'
而下面的代码工作正常
ALTER PROCEDURE spROWCOUNTER
(
@rowCountVal int OUTPUT
)
AS
SELECT @rowCountVal=COUNT(*) FROM DEFECT_LOG
RETURN @rowCountVal
语法问题很容易解决。参数之间缺少一个逗号(“,”)。插入逗号,存储过程将编译:
( @tablename nvarchar(20), @rowCountVal int OUTPUT )
然后,出现了一个主要问题:无法访问EXEC语句中的@rowCountVal参数。要解决此问题,可以使用内置存储过程sp\u executesql
读这个
顺便说一下:您不必“返回”变量。返回值通常用于返回某些状态值。如果您传递一个输出参数,它将自动返回。语法问题很容易解决。参数之间缺少一个逗号(“,”)。插入逗号,存储过程将编译:
( @tablename nvarchar(20), @rowCountVal int OUTPUT )
然后,出现了一个主要问题:无法访问EXEC语句中的@rowCountVal参数。要解决此问题,可以使用内置存储过程sp\u executesql
读这个
顺便说一下:您不必“返回”变量。返回值通常用于返回某些状态值。如果您传递一个输出参数,它将自动返回。是的,我遗漏了逗号。但即使在这之后,该值也不会存储在
@rowCountVal
中
SET @strQuery = 'SELECT @rowCountVal=COUNT(*) *FROM '+ @tablename
EXEC(@strQuery)
查询既不返回也不显示任何值
顺便说一句,我想从其他存储过程调用这个过程来获取
行数
。
以下声明是否有效:
set @rCount = exec spROWCOUNTER('DEFECT_LOG')
是的,我漏掉了逗号。但即使在这之后,该值也不会存储在
@rowCountVal
中
SET @strQuery = 'SELECT @rowCountVal=COUNT(*) *FROM '+ @tablename
EXEC(@strQuery)
查询既不返回也不显示任何值
顺便说一句,我想从其他存储过程调用这个过程来获取
行数
。
以下声明是否有效:
set @rCount = exec spROWCOUNTER('DEFECT_LOG')
创建过程spROWCOUNTER
@表名nvarchar(20),
@rowCountVal int输出
作为
选择@rowCountVal=ISNULL(总和(spart.rows),0)
从sys.spart
其中spart.object_id=object_id(@tablename)和spart.index_id<2
返回@rowCountVal
创建过程spROWCOUNTER
@表名nvarchar(20),
@rowCountVal int输出
作为
选择@rowCountVal=ISNULL(总和(spart.rows),0)
从sys.spart
其中spart.object_id=object_id(@tablename)和spart.index_id<2
返回@rowCountVal
我会使用sp\u executesql而不是exec。然后可以将@rowCountVal作为输出变量传入动态sql
create PROCEDURE spROWCOUNTER
(
@tablename nvarchar(20),
@rowCountVal int OUTPUT
)
AS
DECLARE @strQuery nvarchar(300)
SET @strQuery = 'SELECT @rowCountVal = COUNT(*) FROM '+@tablename
exec sp_executesql @strQuery, N'@tablename nvarchar(20), @rowCountVal int OUTPUT', @tablename = @tablename, @rowCountVal = @rowCountVal output
RETURN @rowCountVal
我将使用sp_executesql而不是exec。然后可以将@rowCountVal作为输出变量传入动态sql
create PROCEDURE spROWCOUNTER
(
@tablename nvarchar(20),
@rowCountVal int OUTPUT
)
AS
DECLARE @strQuery nvarchar(300)
SET @strQuery = 'SELECT @rowCountVal = COUNT(*) FROM '+@tablename
exec sp_executesql @strQuery, N'@tablename nvarchar(20), @rowCountVal int OUTPUT', @tablename = @tablename, @rowCountVal = @rowCountVal output
RETURN @rowCountVal
在execute语句中,可以使用临时表共享数据:
CREATE PROCEDURE spROWCOUNTER
@tablename nvarchar(20),
@rowCountVal int OUTPUT
AS
CREATE TABLE #Result( Rows INT )
EXEC( 'INSERT INTO #Result( Rows ) SELECT COUNT(*) FROM ' + @tablename )
SELECT @rowCountVal = Rows FROM #Result
RETURN @rowCountVal
在execute语句中,可以使用临时表共享数据:
CREATE PROCEDURE spROWCOUNTER
@tablename nvarchar(20),
@rowCountVal int OUTPUT
AS
CREATE TABLE #Result( Rows INT )
EXEC( 'INSERT INTO #Result( Rows ) SELECT COUNT(*) FROM ' + @tablename )
SELECT @rowCountVal = Rows FROM #Result
RETURN @rowCountVal
如果要将行计数作为函数,还可以检查
对于非常大的表,文章中提供的函数显然比调用count(*)要快。如果希望将行计数作为函数,也可以检查 对于非常大的表,本文中提供的函数显然比调用count(*)更快