Выполните большой сценарий SQL (с командами ДВИЖЕНИЯ)

В Swift 2 (с Xcode 7) Array включает метод indexOf , предоставляемый протоколом CollectionType . (На самом деле два метода indexOf - один, который использует равенство для соответствия аргументу, и другой , который использует замыкание.)

До Swift 2 не было путь для общих типов, таких как коллекции, для предоставления методов для конкретных типов, полученных из них (например, массивов). Итак, в Swift 1.x «index of» является глобальной функцией ... И он также переименован, поэтому в Swift 1.x эта глобальная функция называется find.

Это также возможно (но не обязательно) использовать метод indexOfObject из NSArray ... или любого другого более сложного метода поиска из Foundation, не имеющего эквивалентов в стандартной библиотеке Swift. Просто import Foundation (или другой модуль, который транзитивно импортирует Foundation), отрисуйте Array до NSArray, и вы можете использовать множество методов поиска на NSArray.

86
задан bluish 20 August 2015 в 13:53
поделиться

6 ответов

Используйте Объекты управления SQL Server (SMO), который понимает, ИДУТ разделители. Посмотрите мое сообщение в блоге здесь: http://weblogs.asp.net/jongalloway/Handling-_2200_GO_2200_-Separators-in-SQL-Scripts - 2D00 -простой-способ

Пример кода:

public static void Main()    
{        
  string scriptDirectory = "c:\\temp\\sqltest\\";
  string sqlConnectionString = "Integrated Security=SSPI;" +
  "Persist Security Info=True;Initial Catalog=Northwind;Data Source=(local)";
  DirectoryInfo di = new DirectoryInfo(scriptDirectory);
  FileInfo[] rgFiles = di.GetFiles("*.sql");
  foreach (FileInfo fi in rgFiles)
  {
        FileInfo fileInfo = new FileInfo(fi.FullName);
        string script = fileInfo.OpenText().ReadToEnd();
        using (SqlConnection connection = new SqlConnection(sqlConnectionString))
        {
            Server server = new Server(new ServerConnection(connection));
            server.ConnectionContext.ExecuteNonQuery(script);
        }
   }
}

, Если это не будет работать на Вас, посмотрите библиотеку Phil Haack, которая обрабатывает это: http://haacked.com/archive/2007/11/04/a-library-for-executing-sql-scripts-with-go-separators-and.aspx

101
ответ дан Aristos 24 November 2019 в 08:01
поделиться

Если Вы не хотите идти путем SMO, можно искать, и замена "ИДУТ" для""; и запрос, как Вы были бы. Обратите внимание, что soly последний набор результатов будет возвращен.

2
ответ дан jason saldo 24 November 2019 в 08:01
поделиться

Я также столкнулся с той же проблемой, и я не мог найти никакой другой путь, но разделение единственной операции SQL в отдельных файлах, затем выполнив всех их в последовательности.

, Очевидно, проблема не со списками команд DML, они могут быть выполнены без промежуточного ДВИЖЕНИЯ; другая история с DDL (создают, измените, отбросьте...)

2
ответ дан ila 24 November 2019 в 08:01
поделиться

Ключевое слово разделителя пакета "ДВИЖЕНИЯ" на самом деле используется самим Studio управления SQL, так, чтобы это знало, где завершить пакеты, это отправляет к серверу, и это не передается SQL-серверу. Можно даже изменить ключевое слово в Studio управления, должны Вы так требовать.

6
ответ дан John Hubert 24 November 2019 в 08:01
поделиться

Можно использовать Объекты управления SQL для выполнения этого. Это те же объекты что использование Studio управления для выполнения запросов. Я верю Server.ConnectionContext.ExecuteNonQuery(), выполнит то, в чем Вы нуждаетесь.

9
ответ дан bluish 24 November 2019 в 08:01
поделиться

Это - то, что я столкнул для решения моей непосредственной проблемы.

private void ExecuteBatchNonQuery(string sql, SqlConnection conn) {
    string sqlBatch = string.Empty;
    SqlCommand cmd = new SqlCommand(string.Empty, conn);
    conn.Open();
    sql += "\nGO";   // make sure last batch is executed.
    try {
        foreach (string line in sql.Split(new string[2] { "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries)) {
            if (line.ToUpperInvariant().Trim() == "GO") {
                cmd.CommandText = sqlBatch;
                cmd.ExecuteNonQuery();
                sqlBatch = string.Empty;
            } else {
                sqlBatch += line + "\n";
            }
        }            
    } finally {
        conn.Close();
    }
}

Это требует, ИДУТ команды, чтобы быть на их собственной строке и не обнаружит комментарии блока, таким образом, этот вид вещи будет разделен и вызовет ошибку:

ExecuteBatchNonQuery(@"
    /*
    GO
    */", conn);
34
ответ дан Blorgbeard 24 November 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: