3

我遇到了一个问题,我试图在 linux 服务器上恢复 php 中的 MSSQL 转储。我正在读取文件,然后将文件作为查询传递。

这有效:

CREATE TABLE [dbo].[recipes](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Desc] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Directions] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [CompAuthor] [nvarchar](500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [CompName] [nvarchar](500) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Servings] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 CONSTRAINT [PK_recipes] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
)

但是只要我添加一个像 GO 这样的词

WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
 ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
    )

GO

它抛出一个错误,如

Warning: mssql_query(): message: Incorrect syntax near 'GO'

我的问题是导致此错误的原因以及如何解决?

4

2 回答 2

6

GO不是 Transact-SQL 关键字。它是 Management Studio 和 SQLCMD 等工具的批处理分隔符。

答案是不要将GO命令注入到您从应用程序发送的批处理中。只需将它们作为单独的批次发送(如有必要)。

来源:GO(Transact-SQL)

于 2012-06-05T20:47:02.697 回答
0

好吧,有时您的脚本旨在通过 Management Studio 或查询分析器进行部署。

就我而言,我正在管理多台服务器,部署脚本可能很乏味,因此我必须创建一个 PHP 工具,该工具将自动部署到所有服务器。以下是我为克服“GO”问题所做的工作:

    // split the script into several statements
    $sqls = explode("GO",$sql);

    // execute each statement separately
    foreach($sqls as $sqlb)
    {       
        $rs = mssql_query($sqlb, $mssql);

        if (!$rs) {
            echo "MSSQL {$client} sql: {$sqlb} Error: " . mssql_get_last_message();
        } else {

            if($rs === true)
            {
                echo "OK";
            } else
            {
                while($row = mssql_fetch_assoc($rs)) {
                    print_r($row);
                }
            }
        }
    }
于 2016-04-27T13:06:41.160 回答