martedì 6 ottobre 2015

Usare l'operatore like e le varibili di sistema in SQLCMD

Qualche giorno fa scrivevo come ho risolto uno dei miei problemi di accesso ai DB di Microsoft.
Importando le mie query abituali in questa modalità ho incontrato un grosso scoglio, ho impiegato diverse ore per vincere.
Ecco la mia situazione e la mia soluzione.

Mi ero salvato una query che cercava una sottostringa in diversi campi di una tabella con milioni di record
     /****** Script for SelectTopNRows command from SSMS  ******/
     declare @myvar varchar(40) = '%procida.blog%';
     SELECT  *

     FROM [MyDB].[dbo].[MyTable]
     where FileLabel like @myvar
           or FileName like @myvar
           or Parameter like @myvar
Mi riaprivo questa query in SQL Managment Studio, cambiavo il valore di MyVar ed effettuavo la ricerca interessata.

Andando ad inserire questa query all'interno del mio script con SQLCMD da richiamare con RUNAS ho constatato che il simbolo % viene utilizzato da MSSQL come carattere jolly e dallo script MSDOS come delimitatore di variabile ... insomma la query non andava più bene.

Di seguito la soluzione da me trovata:
@echo off
set /P myvar=Inserisci il nomefile da cercare
@echo on
sqlcmd -S sqlinps52\sqlinps52 -W -s ; -o %0.csv -Q"SELECT * FROM [MyDB].[dbo].[MyTable] where FileLabel like char(37) + '%myvar%' + char(37) or FileName like char(37) + '%myvar%' + char(37) or Parameter like char(37) + '%myvar%' + char(37) ;"
%0.csv


Di fatto il valore cha(37) corrisponde al carattere ASCII %, in questo modo però non vien interpretato da MSDOS ma solo da MSSQL risolvendo così il mio problema.

Questo script, di fatto mi aprirà un prompt che mi chiederà di inserire la sottostringa da cercare, grazie al comando SET /P;
Eseguirà la mia query reindirizzando l'output su un file che si chiama come il mio script, ma con estensione csv, grazie all'opzione di sqlcmd -o %0.csv;
Il file di output avrà le colonne divise da ; , grazie all'opzione di sqlcmd -s ;
Al termine della query richiamando %0.csv mi si apre MS Excel con l'output della query.

Qualcuno ha trovato una soluzione migliore? La indicasse.
Questa, intanto, ha risolto egregiamente il mio problema.