Press "Enter" to skip to content

Tych państwa nie obsługujemy

Nie będę ukrywała, problem pojawił się u mnie w pracy. Mamy sobie skrypty SQLowe (w tym przypadku MS SQL). Dużo skryptów. Są one uruchamiane, jak supporter chce „podnieść” wersję bazy. Mamy też w folderze ze skryptami plik runme.bat, który posiada coś takiego:

ECHO Executing scripts in the Tables folder. Please wait…
 CD .\00_Tables
 for %%a in (*.sql) do osql -S "%server%" -d "%database%" -U %login% -P %password% -i %%a -o ..\Result\%%a_Result.txt

powtórzone x razy, per ścieżka. No i któregoś razu, okazuje się, że część skryptów się nie wykonała, a próba uruchomienia paczki zostawiła takiego śmiecia:

Executing scripts in the Tables folder. Please wait…
 Microsoft (R) SQL Server Command Line Tool
 Version 14.0 NT
 Copyright (c) 2015 Microsoft. All rights reserved.
 Note: osql does not support all features of SQL Server 2017.
 Use sqlcmd instead. See SQL Server Books Online for details.
 usage: osql              [-U login id]          [-P password]
   [-S server]            [-H hostname]          [-E trusted connection]
   [-d use database name] [-l login timeout]     [-t query timeout]
   [-h headers]           [-s colseparator]      [-w columnwidth]
   [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
   [-L list servers]      [-c cmdend]            [-D ODBC DSN name]
   [-q "cmdline query"]   [-Q "cmdline query" and exit]
   [-n remove numbering]  [-m errorlevel]
   [-r msgs to stderr]    [-V severitylevel]
   [-i inputfile]         [-o outputfile]
   [-p print statistics]  [-b On error batch abort]
   [-X[1] disable commands [and exit with warning]]
   [-O use Old ISQL behavior disables the following]
        batch processing
       Auto console width scaling
       Wide messages
       default errorlevel is -1 vs 1
   [-? show syntax summary]
 Microsoft (R) SQL Server Command Line Tool
 Version 14.0 NT
 Copyright (c) 2015 Microsoft. All rights reserved.
 Note: osql does not support all features of SQL Server 2017.
 Use sqlcmd instead. See SQL Server Books Online for details.
 usage: osql              [-U login id]          [-P password]
   [-S server]            [-H hostname]          [-E trusted connection]
   [-d use database name] [-l login timeout]     [-t query timeout]
   [-h headers]           [-s colseparator]      [-w columnwidth]
   [-a packetsize]        [-e echo input]        [-I Enable Quoted Identifiers]
   [-L list servers]      [-c cmdend]            [-D ODBC DSN name]
   [-q "cmdline query"]   [-Q "cmdline query" and exit]
   [-n remove numbering]  [-m errorlevel]
   [-r msgs to stderr]    [-V severitylevel]
   [-i inputfile]         [-o outputfile]
   [-p print statistics]  [-b On error batch abort]
   [-X[1] disable commands [and exit with warning]]
   [-O use Old ISQL behavior disables the following]
        batch processing
       Auto console width scaling
       Wide messages
       default errorlevel is -1 vs 1
   [-? show syntax summary]
 Microsoft (R) SQL Server Command Line Tool

i było to powtórzone tyle razy ile … skryptów się nie wykonało:) A doszliśmy po logach, bo pliki z logami się nie stworzyły.
Tym razem nie popełniłam błędu z przyszłości więc przeczytałam co mi komunikat błędu wypisał:

Note: osql does not support all features of SQL Server 2017.
Use sqlcmd instead. See SQL Server Books Online for details.

Aaa czyli coś jest niewspierane? Dziwne, bo przecież do tej pory wspierane było wszystko. Z drugiej skrypty nie zawierały jakichś skomplikowanych rzeczy, które mogłyby nagle przestać być wspierane.

No to jedyne co mogłam zrobić, to zmienić w skrypcie osql na sqlcmd. I co, pomogło? A gdzie tam. To co się nie wykonywało, to się nie wykonywało nadal. Jedyne co się zmieniło, to komunikaty o błędzie.

Sqlcmd: 'Tu nazwa pliku': Invalid filename.

Aaaa ok. No więc zobaczyłam co mu może przeszkadzać – porównując nazwy tych co się wykonały z pozostałymi. I co? Ano to, że Tu nazwa pliku.SQL i jego braciszkowie mieli w środku spacje. A że były przed podkreślnikami to ich nie zauważyłam;)  

Uff. Czyli to był problem. 
Jeszcze żeby ręcznie nie  poprawiać tych nazw to machnęłam sobie taki kawałek tooliszcza tu jest kod , którego rdzeniem jest ten kawałek: 

var pathes = Directory.GetFiles(DirPath, "*.*", SearchOption.AllDirectories);
foreach (var path in pathes)
{
	if (path.Contains(" "))
	{
	    string filename = Path.GetFileName(path);
		string filename_no_space = filename.Replace(" ", "");
		string fullOutputPath = path.Replace(filename, filename_no_space);
		if (!File.Exists(fullOutputPath))
		{
			File.Move(path, fullOutputPath);
		}
    }
}

Podsumowując. Masz podobny błąd? Wywal spacje z nazw plików .sql 🙂

Pozostaje mi życzyć ci miłego dnia.

7 komentarzy

  1. Nie można nazwy pliku wziąć w któreś „ciapki”? Czyli cudzysłów pojedynczy lub podwójny.

    • ja ja

      Nie sprawdzałam. Sprawdzę jutro.

    • ja ja

      dodanie ciapków do for %%a in (*.sql) gdziekolwiek … niekoniecznie dobrze sobie radzi. Zadziałałoby dla pojedynczego pliku. Ograniczenia przetwarzania wsadowego.

  2. Tych państwa nie obsługujemy

    Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl

  3. fido fido

    Na pewno to sprawdziłaś z tymi ciapkami? („%%a” zamiast %%a)

    for %%a in (*.sql) do osql -S „%server%” -d „%database%” -U %login% -P %password% -i „%%a” -o ..\Result\%%a_Result.txt

    Zrobiłem test na szybko i wydaje się działać. Zresztą pozostałe parametry (%server%, %database%, etc.) masz też w ciapkach.

    Konkluzja IMHO bardzo wątpliwa. Wygląda bardziej na zamiatanie problemu pod dywan niż właściwe rozwiązanie. Co jak ktoś za pół roku znowu stworzy skrypt ze spacją? A Ciebie na przykład już w firmie nie będzie (albo na urlopie), więc nie będzie know-how osoby, która na ten problem trafiła. To nie jest rozwiązanie bullet-proof.

    PS. jak używasz Total Commandera to usunąć spacje we wszystkich nazwach plików możesz w jakieś 10 sekund a jak są podfoldery to ewentualnie 20 sekund 🙂

    • ja ja

      ok, to źle ciapki wstawiłam;) Faktycznie;)

      • fido fido

        Hehe 🙂 No i git… Keep it simple 🙂

Comments are closed.