sql - 简单的动态 SQL 查询语法

标签 sql sql-server tsql sql-server-2008-r2 dynamic-sql

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

我有以下查询,它将存储过程输入参数作为变量名并计算该表中的记录。我想将动态语句 (@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 的解决方案,它也不需要任何特殊权限(只需连接和公共(public)成员):

DECLARE @toStart INT;

SELECT @toStart = [rows] 
  FROM sysindexes
  WHERE id = OBJECT_ID(@tempTableName)
  AND indid IN (0,1);

PRINT @toStart;

也就是说,如果您使用计数来确定下一个 ID 可能是什么或类似的内容,我认为您的处理方式是错误的,因为行可以被删除,并且如果它是标识列值由于回滚,可以跳过。

关于sql - 简单的动态 SQL 查询语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11108465/

相关文章:

python - ORDER BY SQLAlchemy 中的子查询

sql - 配置单元查询以将键映射到多个值

SQL - 限制存储过程输入参数

sql-server - SQL Server中模拟Oracle的CONNECT BY PRIOR

sql - 查询以检查开始日期和结束日期之间的日期范围(如果已存在于 postgres 的数据库中)

python - 使用 python 将值导入 MySQL 数据库时出现 SQL 语法错误

sql - 为什么表中的记录排序不是按照聚集索引?

sql - 顺序更新语句

sql - 获取具有 SQL Server 2008 列的 MAX 值的整个 ROW

sql-server - 表变量列中的 nvarchar(max) 与 nvarchar(n)