2014-06-21 11 views
5

Dopo aver letto one answer e second answer e infopage on sqlcmd non riesco ancora a ottenere quanto segue per funzionare.Come evitare il troncamento sqlcmd con il risultato della query del percorso xml

Sto provando a interrogare un risultato in un file xml utilizzando un file sqlcmd in batch.

Il batchfile assomiglia a questo:

sqlcmd -R -d DBName -i "c:\inputquery.sql" -h-1 -y 0 -o "c:\outputfile.xml" 

la query SQL simplicated è:

:XML ON 
SELECT '<?xml version="1.0" encoding="UTF-8"?>' + 
CAST((
SELECT Columns FROM Table 
FOR XML PATH ('Product'), ROOT('Products') 
) 
AS NVARCHAR(MAX)) 

L'uscita è un file XML di circa 1025Kb briciolo una stringa troncata. Penso che tronca a 1 MB, ma come puoi evitare questo? L'obiettivo è ottenere il risultato dell'interrogazione completa nel file xml. Per quanto ne so, tutte le opzioni sono già state utilizzate. Utilizzando TSQL SSMS2008 a proposito.

+0

Se lavori solo in SSMS, ci sono opzioni per controllare la quantità di dati XML che possono essere restituiti. 1 MB, 2 MB, 5 MB o illimitato. Vedi Strumenti | Opzioni | Risultati della query SQL Server | Risultati alla griglia | Dati XML Non ha un'opzione per "Risultati su file". Ma forse potresti eseguire la query sul Grid e quindi salvare i risultati? –

+0

Se si utilizza SSMS solo allora funzionerebbe, ma ho bisogno di automatizzare il processo con un file batch. Le impostazioni SSMS non hanno effetto sul risultato sqlcmd. Grazie comunque! – J3FFK

+0

Ho usato BCP per fare cose come questa. Ecco un esempio di BCP: http://stackoverflow.com/a/2586615/822072 –

risposta

0

È necessario generare il codice XML come tipo XML. Normalmente, ciò viene fatto usando la direttiva TYPE in aggiunta a FOR XML. Ma se vuoi aggiungere la dichiarazione Xml, dovrai mettere tutto in una variabile xml e poi selezionarlo. Es:

DECLARE @XML AS XML 
SET @XML = ' 
SELECT ''<?xml version="1.0" encoding="UTF-8"?>'' + 
CAST((
SELECT Columns FROM Table 
FOR XML PATH (''Product''), ROOT(''Products'') 
) 
AS NVARCHAR(MAX)) 
' 
SELECT @XML 

Edit: Mi dispiace. L'aggiunta della dichiarazione Xml non funzionerà perché Sql presenta il flusso come XML nella sua codifica nativa (UTF-16) e rimuoverà qualsiasi dichiarazione.

3

Mi sono imbattuto nello stesso problema oggi, ho usato l'opzione -y0. La mia uscita sembra corretta ora. Ho pensato di pubblicare le mie scoperte in modo che potessero aiutare gli altri a fare lo stesso.

sqlcmd -Sxxxxxxx -E -dmaster -h-1 -y0 -Q" my query that produces long results in here;" > "D\:out.txt" 

-h-1 rimuove anche le intestazioni di colonna.

+0

Il valore di '-y0' è di un megabyte. (Ho lo stesso problema di OP in cui 1048676 caratteri non sono sufficienti.) – gws

+0

Quando ho provato a usare '-h-1' e' -y0' ho ricevuto questo messaggio di errore: 'Sqlcmd: The -h e the -y 0 opzioni si escludono a vicenda. Anche se sembra che anche senza '-h-1' l'header sia escluso comunque. – ArtOfWarfare

Problemi correlati