6

我在 SQL Server 2005(Management Studio IDE)中使用以下 T-SQL 查询:

DECLARE @id int;
DECLARE @countVal int;
DECLARE @sql nvarchar(max);
SET @id = 1000;
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = @id';
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle

我不确定如何将输入参数@id 传递给EXEC 查询,并将计数结果传递给@countVal。我看到了一些 Microsoft SQL Server 的示例,例如:

EXEC (@sql, @id = @id)

我为 Oracle 尝试了这个,但我得到了一个语句错误:

OLE DB provider "OraOLEDB.Oracle" for linked server "oracleServer" 
returned message "ORA-00936: missing expression"
4

3 回答 3

17

试试这个:

EXEC sp_executesql @sql, N'@id int', @id

这篇精彩文章的更多信息:http: //www.sommarskog.se/dynamic_sql.html


至于输出,您的 SELECT 需要看起来像这样:

SELECT @countVal = COUNT(id) FROM owner.myTable WHERE id = @id

我选择 'id' 而不是 '*' 以避免提取不必要的数据......

那么你的动态sql应该是这样的:

EXEC sp_executesql @sql, 
                   N'@id int, @countVal int OUTPUT', 
                   @id, 
                   @countVal OUTPUT

此示例改编自上面链接的同一篇文章,位于sp_executesql部分。


至于您的 Oracle 错误,您需要找出 sp_executesql 发送给 Oracle 的确切 SQL。如果 Oracle 中有分析器或查询日志,那可能会有所帮助。我在 Oracle 方面的经验有限,但这将是解决问题的下一个合乎逻辑的步骤。

于 2009-02-27T06:12:07.453 回答
1

快速而肮脏的方法是在使用 EXEC 语句之前构建字符串,但这不是推荐的做法,因为您可能会面临 SQL 注入。

DECLARE @id int;
DECLARE @countVal int;
DECLARE @sql nvarchar(max);
SET @id = 1000;
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id 
EXEC (@sql) AT oracleServer -- oracleServer is a lined server to Oracle

执行此操作的正确方法是使用 magnifico 详述的系统存储过程 sp_executesql,Microsoft 在联机丛书中推荐的是:

EXEC sp_executesql @sql, N'@id int', @id
于 2009-02-27T08:34:44.567 回答
0

我不知道你为什么要单独传递 id。

您可以执行以下操作
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id

于 2009-02-27T05:58:53.957 回答