意外的语法错误"。"

时间:2015-03-08 13:40:51

标签: c# sql-server syntax smo

背景

我正在使用SMO读取脚本然后在我的数据库上执行它。我的脚本中有一部分需要在执行之前进行更改,比如数据库的数据。

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

这种情况的变量是prefix

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

enter image description here

代码

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

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
...

问题

为什么我收到此错误?

  

''

附近的语法不正确

2 个答案:

答案 0 :(得分:1)

答案

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

SQL变量中的

字符串

例如,请参阅以Select

开头的行

enter image description here

实际解决方案

在关键字之前添加换行符。

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;

答案 1 :(得分:0)

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

我想我对GO和SMO错了。谢谢马丁。