简单的动态 TSQL 查询语法



这可能是一个简单的答案,但我已经盯着它太久了......

我有以下查询,该查询将存储过程输入参数作为变量名称并对该表中的记录进行计数。 我想将动态语句 (@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 可能是什么,或者类似的东西,我认为您以错误的方式接近这一点,因为可以删除行,如果是标识列值可以跳过回滚。

最新更新