这可能是一个简单的答案,但我已经盯着它看了太久了......
我有以下查询,它将存储过程输入参数作为变量名称并计算该表中的记录。我想将动态语句 (@toStartStr) 的结果检索到变量 (@toStart) 中。
-- @tempTableName = SProc input parameter
DECLARE @toStartStr nvarchar(150);
DECLARE @toStart int;
SET @toStartStr = 'SELECT @toStart = COUNT(ID) FROM ' + @tempTableName;
EXEC(@toStartStr);
现在,一个错误表明 @toStart 不能与字符串 SELECT 连接,但这就是我想要的要点。谁能看到我做错了什么吗?或者建议一个替代方案?仅供参考 SQL 2008 R2。谢谢。
DECLARE @sql NVARCHAR(255);
DECLARE @toStart INT;
SET @sql = N'SELECT @toStart = COUNT(ID) FROM ' + QUOTENAME(@tempTableName);
EXEC sp_executesql @sql, N'@toStart INT OUTPUT', @toStart OUTPUT;
PRINT @toStart;
然而,如果您可以忽略当前正在进行的事务(并且您使用的是 SQL Server 2005 或更好的版本 - 请在提问时指定版本!),则有一种更简单、更有效的方法可以实现此目的。
DECLARE @toStart INT;
SELECT @toStart = SUM(rows)
FROM sys.partitions
WHERE [object_id] = OBJECT_ID(@tempTableName)
AND index_id IN (0,1);
PRINT @toStart;
为了完整起见,这里是 SQL Server 2000 的解决方案,它也不需要任何特殊权限(只需连接和公共成员):
DECLARE @toStart INT;
SELECT @toStart = [rows]
FROM sysindexes
WHERE id = OBJECT_ID(@tempTableName)
AND indid IN (0,1);
PRINT @toStart;
也就是说,如果您使用计数来确定下一个 ID 可能是什么,或者类似的东西,我认为您的处理方式是错误的,因为可以删除行,并且如果它是标识列值则可以跳过由于回滚。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)