J'ai un script qui contient several SQL Commands. Comme j'ai besoin de diviser les commandes une par une, j'utilise le mot go pour créer un lot.

Dim script = "SELECT * FROM TABLEX; " _
             & "go " _
             & "----- some coment that includes go word like ago " _
             & "INSERT INTO TABLEX .... ;" _
             & "go "
For Each sqlBatch As String In script.Split(New String() {"GO", "Go", "go"}, StringSplitOptions.RemoveEmptyEntries)
   'use sqlBatch 
Next

Si le script a des commentaires, cela fonctionne bien, mais quand il a un mot go comme "ago", l'instruction casse la chaîne et sql génère une erreur, par exemple dans l'exemple que j'obtiendrais:

SELECT * FROM TABLEX;
----- some coment that includes 
 word like a
INSERT INTO TABLEX .... ;

Ce qui n'est évidemment pas ce que je veux, Comment puis-je dire d'utiliser Split pour éviter les commentaires et ne pas échouer sur ces go mots contenant des cas? Alors je reçois:

SELECT * FROM TABLEX;
INSERT INTO TABLEX .... ;
1
edgarmtze 29 déc. 2015 à 21:24

3 réponses

Meilleure réponse

Vous pouvez utiliser la bibliothèque Objets Sql Server Management. Les objets de cette bibliothèque ne sont pas dupés par le séparateur GO entre les commandes et vous pouvez soumettre votre script en utilisant un seul ExecuteNonQuery

Imports Microsoft.SqlServer.Management.Common
Imports Microsoft.SqlServer.Management.Sdk.Sfc
Imports Microsoft.SqlServer.Management.Smo
Imports System.Collections.Specialized

' Read the script. It is important to use a StringCollection'
Dim cmd = File.ReadAllText("d:\temp\create.sql")
Dim col = new StringCollection()
col.Add(cmd)

Using con = new SqlConnection(".....")
    Dim svrConnection = new ServerConnection(con)
    Dim server = new Server(svrConnection)
    server.ConnectionContext.ExecuteNonQuery(col)
End Using

Pour que ce code fonctionne, vous devez avoir installé les bibliothèques Sql Server Management Objects et ajouter la référence requise et les instructions Imports

Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.Management.Sdk.sfc.dll
2
Steve 29 déc. 2015 à 18:50

Pas sur ma machine de développement, mais je pense que cela fonctionnerait:

    For Each sqlBatch As String In script.Split(New String() 
{environment.newline+"GO", 
environment.newline+"Go", 
environment.newline+"go", 
StringSplitOptions.RemoveEmptyEntries)
   'use sqlBatch
0
C.Chen 29 déc. 2015 à 19:01

Fin de l'utilisation de la ScriptSplitter classe de ststeiger

Dim script = "SELECT * FROM TABLEX; " _
             & Environment.NewLine & "go " _
             & Environment.NewLine & "----- some coment that includes go word like ago " _
             & Environment.NewLine & "INSERT INTO TABLEX .... ;" _
             & Environment.NewLine & "go "
Dim scs As New Subtext.Scripting.ScriptSplitter(script)
For Each str As String In scs
    Console.WriteLine(str)
Next
2
edgarmtze 29 déc. 2015 à 21:06