背景:
我正在使用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
...
问题:
为什么我收到此错误?
''
附近的语法不正确
答案 0 :(得分:1)
在显示实际放入变量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;
答案 1 :(得分:0)
“GO”实际上不是SQL。它被sqlcmd.exe和SQL Server Mngmnt Studio识别为批处理分隔符。 但它在SMO中无效。您将不得不删除所有'GO'并在单独的语句中执行批处理。 击>
我想我对GO和SMO错了。谢谢马丁。