0

我们在服务器 A 上存在一个数据库。服务器 A 还托管我们将调用 SQL 语句的程序代码。

我们VMIntranetTest在服务器 B 上有另一个数据库VMC-MMS

服务器 A 和服务器 B 具有不同的登录用户凭据。服务器 A 和服务器 B 都存在于我们的内部网络上。

使用 PHP,我定义了以下 SQL 语句。

$strSql = 'INSERT INTO VMC-MMS.VMIntranetTest.dbo.TestTable (FirstName, LastName, Age) ' .
                    'SELECT FNAME, LNAME, AGE ' .
                    'FROM BSLIB.SQLTSTF ';

FROM -> BSLIB.SQLTSTF <-位于我们的本地服务器 (A) 上,因此用于执行语句的连接字符串将具有连接到服务器 A 的用户凭据。

INSERT INTO -> VMC-MMS.VMIntranetTest.dbo.TestTable <-是不同的 server.database.dbo.table(服务器 B)。

如何指定要用于语句的 INSERT INTO 部分的用户凭据?包含 SELECT FROM 语句的次要部分应该已经包含在我的初始连接字符串中。

谢谢,

编辑 1关于保罗的回答。

我尝试使用OPENROWSET上述方法,并使用以下 SQL 语句。

INSERT INTO VMIntranetTest.TestTable (FirstName, LastName, Age)
OPENROWSET('vmas400',
           'Server=192.168.1.2;Trusted_Connection=yes;user_id=INTRAIS;password=****',
           'SELECT FNAME, LNAME, AGE FROM BSLIB.SQLTSTF' ) as a 

正如你所看到的,我改变了一些事情。我通过代码的连接字符串打开了与服务器 B“VMC-MMS”的连接。我的 SQL 语句“选择”部分,使用 OPENROWSET 打开到服务器 A“192.168.1.2”的连接。

但是,我收到此错误消息:

SQLSTATE [HY000]:一般错误:“OPENROWSET”附近的 1:语法错误

编辑 2 我需要将整个 OPENROWSET 部分放在 VALUES ( ) 子句中。现在我收到一条消息:

SQLSTATE[HY000]: 一般错误: 1 no such table: VMIntranetTest.TestTable

编辑 3

我现在有以下 SQL

 INSERT INTO VMIntranetTest.TestTable (FirstName, LastName, Age)
 select a.FNAME, a.LNAME, a.AGE FROM 
 OPENROWSET('vmas400',
            'Server=192.168.1.2;Trusted_Connection=yes;user_id=INTRAIS;password=****',
            'SELECT FNAME, LNAME, AGE FROM BSLIB.SQLTSTF' ) as a

我收到了这个错误:

SQLSTATE[HY000]:一般错误:“(”附近的 1:语法错误

4

2 回答 2

4

你只需要SELECT那里的声明。尝试这个:

INSERT INTO VMIntranetTest.dbo.TestTable (a.FirstName, a.LastName, a.Age)
SELECT a.FirstName, a.LastName, a.Age FROM
OPENROWSET('vmas400',
           'Server=192.168.1.2;Trusted_Connection=yes;user_id=INTRAIS;password=****',
           'SELECT FNAME, LNAME, AGE FROM BSLIB.dbo.SQLTSTF' ) as a

编辑:现在尝试查询。您从数据库中指定了表,但没有指定架构。如果您具有适当的权限,则上述查询现在将起作用。否则,您将需要指定架构。很抱歉没有抓住那个!

于 2012-05-29T15:15:47.910 回答
1

您可以使用OPENROWSET从不同的数据库中选择数据

http://msdn.microsoft.com/en-us/library/ms190312.aspx

于 2012-05-29T13:43:42.163 回答