如何将参数值传递给T-SQL查询

时间:2009-02-27 05:52:48

标签: sql-server oracle sql-server-2005 ora-00936

我在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"

3 个答案:

答案 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