2014-06-21 11 views
5

Po przeczytaniu one answer i second answer i infopage on sqlcmd nadal nie mogę wykonać poniższych czynności.Jak zapobiec obcinaniu sqlcmd z wynikiem zapytania ścieżki xml

Próbuję wysłać zapytanie do wyniku w pliku xml przy użyciu pliku sqlcmd w pliku wsadowym.

program wsadowy wygląda następująco:

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

simplicated zapytań SQL jest:

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

Wyjście jest plikiem XML o 1025Kb odrobina obcięty ciąg. Myślę, że obcina się do 1mb, ale jak możesz temu zapobiec? Celem jest uzyskanie pełnego wyniku zapytania w pliku xml. O ile mi wiadomo, wszystkie opcje są już używane. Korzystanie z TSQL SSMS2008 przy okazji.

+0

Jeśli pracujesz w systemie SSMS, istnieją opcje kontrolowania, ile danych XML można zwrócić. 1 MB, 2 MB, 5 MB lub bez ograniczeń. Zobacz Narzędzia | Opcje | Wyniki zapytania | SQL Server | Wyniki dla siatki | Dane XML. Nie ma opcji "Wyniki do pliku". Ale może mógłbyś uruchomić zapytanie do siatki, a następnie zapisać wyniki? –

+0

Jeśli używasz tylko SSMS to działałoby, ale muszę zautomatyzować proces za pomocą pliku wsadowego. Ustawienia SSMS nie mają wpływu na wynik sqlcmd. Dzięki i tak! – J3FFK

+0

Użyłem BCP do robienia takich rzeczy. Oto przykład BCP: http://stackoverflow.com/a/2586615/822072 –

Odpowiedz

0

Musisz wyprowadzić swój XML jako typ XML. Zwykle odbywa się to przy użyciu dyrektywy TYPE oprócz FOR XML. Ale jeśli chcesz dodać deklarację Xml, będziesz musiał umieścić wszystko w zmiennej xml, a następnie wybrać. Ex:

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: Przepraszam. Dodanie deklaracji Xml nie będzie działało, ponieważ Sql przedstawia strumień jako XML w swoim natywnym kodowaniu (UTF-16) i usunie wszelkie deklaracje.

3

Wpadłem dziś na ten sam problem, użyłem opcji -y0. Moje wyniki są teraz poprawne. Pomyślałem, że opublikuję moje wyniki, aby pomóc innym w tym samym.

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

-h-1 usuwa również nagłówki kolumn.

+0

Limit "-y0" wynosi jeden megabajt. (Mam taki sam problem jak OP, w którym 1048676 znaków nie wystarcza.) – gws

+0

Kiedy próbowałem używać '-h-1' i' -y0', otrzymałem ten komunikat o błędzie: 'Sqlcmd: The -h i -y 0 opcji wzajemnie się wyklucza. ". Chociaż wydaje się, że nawet bez '-h-1", nagłówek jest wyłączony. – ArtOfWarfare