‘System.Data.SqlClient.SQLException’: неправильный синтаксис рядом с ключевым словом ‘CREATE’

#c# #sql-server

#c# #sql-сервер

Вопрос:

Я пытаюсь получить записи таблицы, удовлетворяющие некоторым условиям, но я получил

System.Data.SqlClient.SQLException

Сначала я создал объект DbCommand с именем ‘Command’.

 var queryText = "CREATE VIEW T1 AS (SELECT SUM(TestTable.Id) AS [SUM TestTable.Id], TestTable.Name AS [TestTable.Name] FROM TestTable GROUP BY TestTable.Name );nCREATE VIEW T2 AS (SELECT [TestTable.Name] FROM (SELECT TestTable.Name AS [TestTable.Name], Row_Number()  OVER(PARTITION BY TestTable.Name  ORDER BY TestTable.Name) AS row_number  FROM TestTable ) AS T WHERE T.row_number = 1);nSELECT T1.[TestTable.Name], [SUM TestTable.Id] FROM T1, T2 WHERE T1.[TestTable.Name] = T2.[TestTable.Name] ";

var Database.Connection.ConnectionString = "Data Source=SONDHE;Initial Catalog=Test;Persist Security Info=True;User ID=sa;Password=K1nh#bang#te#the;Application Name=EntityFrameworkMUE";

var command = Database.Connection.CreateCommand()
command.CommandText = queryText;
command.Connection = Database.Connection;
command.CommandTimeout = 180;
  

Затем я выполнил команду для получения записей:

 using (var reader = command.ExecuteReader())
{
    return reader.ToExpandoList();
}
  

но это выдает ошибку:

Неправильный синтаксис рядом с ключевым словом ‘CREATE’

Но я запустил этот запрос в SQL Server, и он успешно выполнен.

Это таблица TestTable в базе данных Test на сервере SQL. Я надеюсь, что кто-нибудь сможет мне объяснить. Спасибо!

Комментарии:

1. Запустите его дважды и увидите, как он взорвется!.

2. удалите бесполезный n между тремя командами. Для их разделения достаточно точки с запятой. Этот текст запроса считывается анализатором базы данных, ему не нужно размещать запросы в отдельных строках.

3. Вы никогда не должны смешивать DDL (подобный языку определения данных CREATE VIEW ) с DML (подобным языку обработки данных SELECT ) в одном операторе!

4. Вам следует изучить намного больше и попробовать немного усерднее, прежде чем отправлять вопросы в StackOverflow. Это место не предназначено для замены самых базовых навыков разработки. Тем не менее, вы пытаетесь сделать много вещей в одном запросе. Вы пытались разделить их на 3 отдельные команды, каждая со своим собственным запросом? Запросы «Создать представление» должны выполняться с помощью command. Выполните Onquery() вместо command. ExecuteReader(). Я только не понизил ваш голос, потому что это ваш первый вопрос. Старайтесь усерднее.

5. CREATE VIEW должно быть единственным оператором в пакете. Вы не можете выполнить один пакет с несколькими операторами create view (или любыми другими операторами). Используйте отдельные ExecuteNonQuery команды для каждого представления, а затем ExecuteReader для SELECT запроса.

Ответ №1:

Замените слова CREATE VIEW словом WITH и удалите точку с запятой