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

Dav*_*.ca 6 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
Run Code Online (Sandbox Code Playgroud)

我不知道如何将输入参数@id传递给EXEC查询,并将计数结果传递给@countVal.我看到了一些Microsoft SQL服务器的例子:

EXEC (@sql, @id = @id)
Run Code Online (Sandbox Code Playgroud)

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

OLE DB provider "OraOLEDB.Oracle" for linked server "oracleServer" 
returned message "ORA-00936: missing expression"
Run Code Online (Sandbox Code Playgroud)

Jim*_*nts 17

试试这个:

EXEC sp_executesql @sql, N'@id int', @id
Run Code Online (Sandbox Code Playgroud)

更多信息在这篇伟大的文章:http://www.sommarskog.se/dynamic_sql.html


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

SELECT @countVal = COUNT(id) FROM owner.myTable WHERE id = @id
Run Code Online (Sandbox Code Playgroud)

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

然后你的动态SQL应该是这样的:

EXEC sp_executesql @sql, 
                   N'@id int, @countVal int OUTPUT', 
                   @id, 
                   @countVal OUTPUT
Run Code Online (Sandbox Code Playgroud)

此示例改编自上面链接的相同文章,在sp_executesql部分中.


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