Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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/7/sql-server/22.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
从exec(@sql)返回值_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

从exec(@sql)返回值

从exec(@sql)返回值,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我想从Exec(@sql)获取值,并分配给@Rowcount(int) 我的问题是: 'SET @RowCount = (select count(*) FROM dbo.Comm_Services WHERE CompanyId = '+cast(@CompanyId as char)+' and '+@condition+')' 如果我理解正确,(我可能不理解) 这是我的程序 CREATE PROC sp_c

我想从
Exec(@sql)
获取值,并分配给
@Rowcount(int)

我的问题是:

'SET @RowCount = (select count(*) 
                    FROM dbo.Comm_Services 
                   WHERE CompanyId = '+cast(@CompanyId as char)+' and '+@condition+')'

如果我理解正确,(我可能不理解)

这是我的程序

CREATE PROC sp_count
    @CompanyId sysname,
    @codition sysname
    AS
    SET NOCOUNT ON
    CREATE TABLE #ctr
    ( NumRows int )

    DECLARE @intCount int
         , @vcSQL varchar(255)

    SELECT    @vcSQL = ' INSERT #ctr FROM dbo.Comm_Services 
                       WHERE CompanyId = '+@CompanyId+' and '+@condition+')'
    EXEC      (@vcSQL)

    IF @@ERROR = 0
    BEGIN
         SELECT    @intCount = NumRows
         FROM #ctr

         DROP TABLE #ctr
         RETURN @intCount
    END
    ELSE
    BEGIN
         DROP TABLE #ctr
         RETURN -1
    END
    GO

一方面,您可以使用sp_executesql:

exec sp_executesql N'select @rowcount=count(*) from anytable', 
                    N'@rowcount int output', @rowcount output;
另一方面,您可以使用临时表:

declare @result table ([rowcount] int);
insert into @result ([rowcount])
exec (N'select count(*) from anytable');
declare @rowcount int = (select top (1) [rowcount] from @result);

今天我在玩这个。。。我相信您也可以使用@ROWCOUNT,如下所示:

DECLARE @SQL VARCHAR(50)
DECLARE @Rowcount INT
SET @SQL = 'SELECT 1 UNION SELECT 2'
EXEC(@SQL)
SET @Rowcount = @@ROWCOUNT
SELECT @Rowcount
SELECT 1
FROM dbo.Comm_Services
WHERE....
....
然后将“选择1联合选择2”替换为不带计数的实际选择。我建议在你的选择中加1,如下所示:

DECLARE @SQL VARCHAR(50)
DECLARE @Rowcount INT
SET @SQL = 'SELECT 1 UNION SELECT 2'
EXEC(@SQL)
SET @Rowcount = @@ROWCOUNT
SELECT @Rowcount
SELECT 1
FROM dbo.Comm_Services
WHERE....
....
(与放置SELECT*相反)

希望有帮助。

声明@nReturn int=0
EXEC@nReturn=storageprocedures

变量将超出对
EXEC(“…”)
的调用范围。这可用于检索存储过程的返回值,但不是动态SQL。非常好!除了在SQL 2016中,这会给出“关键字“rowcount”附近的不正确语法”。ROWCOUNT似乎是一个保留标识符。搜索并将rowcount替换为row_count非常有效。谢谢,很好。但是,不要忘记在末尾删除该表。@Zamir
@result
是一个表变量,而不是临时表,因此不需要删除它。事实上,您不能删除它,就像您不能删除任何其他变量(如整数)一样。非常感谢您的评论。重命名是一个选项,放在括号中是我在编辑后的答案中选择的另一个选项。是的,您不能删除表变量——它们只存在于变量的作用域内。