Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 语法问题:在存储过程中使用变量_Sql Server_Visual Studio_Sql Server 2005_Stored Procedures - Fatal编程技术网

Sql server 语法问题:在存储过程中使用变量

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

有人能告诉我下面的代码是如何正确的吗。Iam尝试创建一个存储过程,该过程返回传递给它的表的行数

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(*)更快