使用参数化查询在远程服务器上执行
EXEC at remote server using paramaterized query
我正尝试在链接服务器上 运行 以下 SQL;
INSERT INTO dbo.test (FirstName, LastName)Values(?,?)
dbo.test
存在于链接服务器上,其别名来自 (DATALOADER01
) 的本地 SQL 服务器。
因此,我要执行的查询是;
EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)') AT [DATALOADER01]
Ruby 正在执行 SQL;
的代码
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
我得到的错误是 'Index 1 is out of range'
当我将非参数化查询传递给 execute_q
时,该代码有效。例如;
EXEC('CREATE TABLE dbo.test2 (Test nvarchar(max))') AT [DATALOADER01]
没有权限问题,链接设置正确,所以我不担心那里有问题。
我很感激我可以在不使用 EXEC
的情况下插入链接服务器,但是 MERGE
除非以这种方式完成,否则语句不起作用。
如果你使用
EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)') AT [DATALOADER01]
您只是要求 SQL 服务器将字符串 'INSERT INTO dbo.test (FirstName, LastName)Values(?,?)'
转发到链接服务器。它不知道参数。为了能够提供参数,您需要将它们作为正在执行的 exec
语句的一部分显式发送。所以你需要使用:
EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)', ?, ?) AT [DATALOADER01]
这里你在exec
命令中添加了两个参数,这样SQL服务器就可以识别出你要传递的参数。
我正尝试在链接服务器上 运行 以下 SQL;
INSERT INTO dbo.test (FirstName, LastName)Values(?,?)
dbo.test
存在于链接服务器上,其别名来自 (DATALOADER01
) 的本地 SQL 服务器。
因此,我要执行的查询是;
EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)') AT [DATALOADER01]
Ruby 正在执行 SQL;
的代码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
我得到的错误是 'Index 1 is out of range'
当我将非参数化查询传递给 execute_q
时,该代码有效。例如;
EXEC('CREATE TABLE dbo.test2 (Test nvarchar(max))') AT [DATALOADER01]
没有权限问题,链接设置正确,所以我不担心那里有问题。
我很感激我可以在不使用 EXEC
的情况下插入链接服务器,但是 MERGE
除非以这种方式完成,否则语句不起作用。
如果你使用
EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)') AT [DATALOADER01]
您只是要求 SQL 服务器将字符串 'INSERT INTO dbo.test (FirstName, LastName)Values(?,?)'
转发到链接服务器。它不知道参数。为了能够提供参数,您需要将它们作为正在执行的 exec
语句的一部分显式发送。所以你需要使用:
EXEC('INSERT INTO dbo.test (FirstName, LastName)Values(?,?)', ?, ?) AT [DATALOADER01]
这里你在exec
命令中添加了两个参数,这样SQL服务器就可以识别出你要传递的参数。