MTA*_*min 8 sql t-sql sql-server dynamic-sql sql-server-2008-r2
这可能是一个简单的答案,但我已经盯着它看了太久......
我有以下查询,它将存储过程输入参数作为变量名称并计算该表中的记录.我想将动态语句(@toStartStr)的结果检索到变量(@toStart)中.
-- @tempTableName = SProc input parameter
DECLARE @toStartStr nvarchar(150);
DECLARE @toStart int;
SET @toStartStr = 'SELECT @toStart = COUNT(ID) FROM ' + @tempTableName;
EXEC(@toStartStr);
Run Code Online (Sandbox Code Playgroud)
眼下,一个错误提示@toStart不能与串选择连在一起,但是这是我想要的要点.谁能看到我做错了什么?或建议另类?仅供参考我的SQL 2008 R2.谢谢.
Aar*_*and 11
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;
Run Code Online (Sandbox Code Playgroud)
然而,有这样做了更简单,更有效的方式,如果您能够接受忽略当前正在执行的事务(和你使用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;
Run Code Online (Sandbox Code Playgroud)
为了完整起见,这里是SQL Server 2000的解决方案,它也不需要任何特殊权限(只需连接和公共成员):
DECLARE @toStart INT;
SELECT @toStart = [rows]
FROM sysindexes
WHERE id = OBJECT_ID(@tempTableName)
AND indid IN (0,1);
PRINT @toStart;
Run Code Online (Sandbox Code Playgroud)
也就是说,如果您使用的是数量,以确定哪些下一个ID可能是,或类似的东西,我觉得你这个接近走错了路,因为行可以被删除,如果它是一个标识列的值可以跳过由于回滚.
| 归档时间: |
|
| 查看次数: |
7183 次 |
| 最近记录: |