【问题标题】:How to pass parameter values to a T-SQL query如何将参数值传递给 T-SQL 查询
【发布时间】:2010-10-10 06:26:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这样输入参数没问题,但是结果呢?
    【解决方案2】:

    试试这个:

    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 方面的经验有限,但这将是解决您的问题的下一个合乎逻辑的步骤。

    【讨论】:

    • EXEC() 示例不适用于 Oracle,非常可悲。如果@sql 中没有参数,它运行良好。我不知道对 Oracle db 使用传递查询,并将输出参数返回给 SQL。
    • SET @sql = 'select ? = count(*) from owner.mytable'; oracleServer 的 exec (@sql, @countVal 输出) -- Oracle 案例失败
    • 这种方法的问题是你不能从另一个存储过程中返回结果集......不创建临时表(动态查询不可行)......不存在有这样的功能吗?
    【解决方案3】:

    快速而肮脏的方法是在使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2017-03-08
      相关资源
      最近更新 更多