意外的语法错误“。”

Unexpected Syntax Error "."

背景:

我正在使用 SMO 读取脚本,然后在我的数据库上执行它。我的脚本的某些部分需要在执行之前更改,例如数据库的数据。

变量在被允许之前被清理和检查,并且只能包含大写字母。

本例变量为prefix

但是由于某种原因,当我在脚本的这个特定部分使用变量时,出现以下错误。

代码:

生成此错误报告的代码行如下所示。

sql += @"FROM dbo." + prefix + "reportEmails";

完整的代码块如下所示。

     sql += @"

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO";
            sql += Environment.NewLine;
            sql += @"CREATE VIEW [dbo].[" + prefix + "reportEmails]";
            sql += @"AS
SELECT     EmailID, EmailContent, EmailSubject, EmailTo, EmailFrom, UserID, ObjectValueID, EmailSent, EmailCreated, EmailRead, EmailFromName, EmailType, EmailFailed, 
                      CASE WHEN emailread IS NULL THEN 'Not Read' ELSE 'Read' END AS EmailStatus
FROM         DEReportingClient2DB.dbo.Emails AS Emails_1
WHERE     (UserID IN
                          (SELECT     UserID
                            FROM          DEReportingClient2DB.dbo.Users
                            WHERE      (ClientID = 195)))
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO";
            sql += Environment.NewLine;
            sql += @"CREATE VIEW [dbo].[" + prefix + "unreadEmails]";
            sql += @"AS
SELECT     COUNT(*) AS UnreadEmails, UserID";
            sql += @"FROM dbo." + prefix + "reportEmails";
sql += @"WHERE     (EmailRead IS NULL)
GROUP BY UserID
GO
...

问题:

为什么会出现此错误?

Incorrect syntax near '.'

"GO" 实际上不是 SQL。它被 sqlcmd.exe 和 SQL Server Mngmnt Studio 识别为批定界符。 但在SMO中无效。您将必须删除所有“GO”并在单独的语句中执行批处理。

我想我对 GO 和 SMO 的看法是错误的。谢谢马丁。

回答

在显示实际放入变量的内容后 SQL 我发现有时代码没有放在换行符上。这导致了单词的连接。

SQL 变量中的字符串

例如,参见以 Select

开头的行

实际解决方案

在关键字前添加一个换行符。

sql+=Environment.NewLine;

例子

            sql += Environment.NewLine;
            sql += @"CREATE VIEW [dbo].[" + prefix + "unreadEmails]";
            sql += Environment.NewLine;
            sql += @"AS";
            sql += Environment.NewLine;
            sql += @"SELECT     COUNT(*) AS UnreadEmails, UserID";
            sql += Environment.NewLine;
            sql += @"FROM dbo." + prefix + "reportEmails";
            sql += Environment.NewLine;