微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

简单的动态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可能是什么,或者类似的东西,我认为你正在以错误的方式接近它,因为可以删除行,如果它是一个标识列值可以跳过由于回滚.

原文地址:https://www.jb51.cc/mssql/77495.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐