【问题标题】:EXEC at remote server using paramaterized query使用参数化查询在远程服务器上执行
【发布时间】:2017-04-18 22:59:38
【问题描述】:

我正在尝试在链接服务器上运行以下 SQL;

INSERT INTO dbo.test (FirstName, LastName)Values(?,?)

dbo.test 存在于链接服务器上,其别名来自本地 SQL 服务器 (DATALOADER01)。

因此,我要执行的查询是;

EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)') AT [DATALOADER01]

正在执行 SQL 的 Ruby 代码;

def connect(server, database)
    url = "jdbc:sqlserver://%s;databaseName=%s;integratedSecurity=true" % [server, database]
    return java.sql.DriverManager.get_connection(url)
end

    def execute_q(statement, options = [])
        @conn = connect('sql','master')
        ps = @conn.prepareStatement(statement)
        options.each_with_index do |opt, index|
            set_param(ps, index.to_i + 1, opt)  
        end
        ps.execute()
    end

我得到的错误是“索引 1 超出范围”

当我将非参数化查询传递给execute_q 时,该代码有效。例如;

EXEC('CREATE TABLE dbo.test2 (Test nvarchar(max))') AT [DATALOADER01]

没有权限问题,链接设置正确,所以我不担心那里有问题。

我很感激我可以在不使用 EXEC 的情况下插入链接服务器,但是除非这样做,否则 MERGE 语句不起作用。

【问题讨论】:

  • 试试EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)', ?, ?) AT [DATALOADER01]。您需要将参数传递给正在执行的参数化查询。
  • 完美,有效!谢谢!
  • 太好了,我不是 100% 确定它会工作,而且我手头没有安装 SQL Server 来检查

标签: sql-server ruby jdbc jruby


【解决方案1】:

如果你使用

EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)') AT [DATALOADER01]

您只是要求 SQL Server 将字符串 'INSERT INTO dbo.test (FirstName, LastName)Values(?,?)' 转发到链接服务器。它不知道参数。为了能够提供参数,您需要将它们作为您正在执行的exec 语句的一部分显式发送。所以你需要使用:

EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)', ?, ?) AT [DATALOADER01]

在此您将两个参数添加到exec 命令,然后允许 SQL Server 识别您要传递的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多