我在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服务器的例子:
EXEC (@sql, @id = @id)
我为Oracle尝试了这个,但是我收到了一个声明错误:
OLE DB provider "OraOLEDB.Oracle" for linked server "oracleServer"
returned message "ORA-00936: missing expression"
答案 0 :(得分: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的经验有限,但这将是解决问题的下一个合乎逻辑的步骤。
答案 1 :(得分:0)
我不知道你为什么单独传递id。
您可以执行以下操作
SET @sql = 'SELECT COUNT(*) FROM owner.myTable WHERE id = ' + @id
答案 2 :(得分:0)
快速而肮脏的方法是在使用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