Sql server 使用参数化查询在远程服务器上执行

Sql server 使用参数化查询在远程服务器上执行,sql-server,ruby,jdbc,jruby,Sql Server,Ruby,Jdbc,Jruby,我试图在链接服务器上运行以下SQL INSERT INTO dbo.test (FirstName, LastName)Values(?,?) dbo.test存在于链接服务器上,其别名来自(DATALOADER01)的本地SQL server 因此,我要执行的查询是 EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)') AT [DATALOADER01] 执行SQL的Ruby代码 def connect(server,

我试图在链接服务器上运行以下SQL

INSERT INTO dbo.test (FirstName, LastName)Values(?,?)
dbo.test
存在于链接服务器上,其别名来自(
DATALOADER01
)的本地SQL server

因此,我要执行的查询是

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\u q
时,代码会起作用。比如,

EXEC('CREATE TABLE dbo.test2 (Test nvarchar(max))') AT [DATALOADER01]
没有权限问题,链接设置正确,因此我不担心存在问题

我很感激我可以在不使用
EXEC
的情况下插入链接服务器,但是
MERGE
语句只有这样才能工作。

如果使用

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

EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)', ?, ?) AT [DATALOADER01]
在这里,您可以向
exec
命令添加两个参数,然后SQL Server可以识别您想要传递的参数。

如果您使用

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

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

在这里,您可以向
exec
命令添加两个参数,然后SQL Server可以识别您想要传递的参数。

在[DATALOADER01]处尝试
exec('插入dbo.test(FirstName,LastName)值(?),?,?,?,?)。您需要将参数传递给正在执行的参数化查询。太好了,可以了!谢谢太好了,我不是100%确定它会工作,而且我手头没有SQL Server安装来检查[DATALOADER01]
上的[try
EXEC('INSERT-INTO-dbo.test(FirstName,LastName)值(?,),?,?,?)。您需要将参数传递给正在执行的参数化查询。太好了,可以了!谢谢太好了,我不是100%确定它会工作,而且我手头没有SQL Server安装要检查