2013-03-22 5 views
5

Setup:

CREATE TABLE MyTest (TestCol1 nchar(5)) 

prova:

A seguito dei lavori:

Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES ('`$5')" 
Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES ('(5')" 

seguito non riesce con il seguente errore:

Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES ('`$(5')" 
Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -OutputSqlErrors $True -Query "INSERT INTO MyTest VALUES ('`$`(5')" 

Errore: Invoke-Sqlcmd: Alla riga: 1 carattere: 1 + Invoke-Sqlcmd -Database "databasename" -ServerInstance "hostname" -Ou ... + ~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ + CategoryInfo: ParserError: (:) [Invoke-Sqlcmd], ParserException + FullyQualifiedErrorId: ExecutionFailureException, Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

Aftersome research ho trovato $ (fornisce funzionalità in PowerShell quindi è riservato. Comunque ho provato a scappare dalla parentesi ma senza successo. Ho provato a trovare un'alternativa. Qualche idea su come posso fare questo? Se utilizzo la funzione CHAR in SQL Server che funziona, sarebbe un problema affrontarlo nel mio codice. Grazie.

risposta

0

Il problema sembra che il $ (è una parola riservata in Powershell per fare questo lavoro ho usato la funzione CHAR per memorizzare $ (CHAR (36)). Una volta fatto questo ha funzionato ma per questo progetto ho abbandonato utilizzando il comando Invoke-SqlCmd e utilizzato un metodo ADO.NET standard.Sembra che Invoke-SqlCmd voglia analizzare il comando e che la combinazione riservata continui a vedere la parola riservata anche se si sfuggono i caratteri.

0

provare questo:

'INSERT INTO MyTest VALUES ("$(5")' 

o questo:

'INSERT INTO MyTest VALUES (''$(5'')' 
+0

Per fornire una ragione per cui questo funziona: In PowerShell, stringhe tra doppi apici (' "ciao"') vengono analizzati per le variabili. Le stringhe con quotatura singola (''hello'') sono trattate come stringhe letterali e non vengono mai analizzate. Prova quanto segue: '$ x = 0; "$ X"; '$ X''. Detto questo, il tuo primo esempio '" INSERT INTO MyTest VALUES ('\ '$ (5')" 'dovrebbe funzionare .. Questa è una stringa corretta –

+0

@BaconBits Penso che questo commento sia stato migliore nell'OP, non nella mia risposta O è per me questo commento? :) –

+0

Se lo eseguo in questo modo, mi aspetto più caratteri con il prompt >>. – Russ960

-2
"INSERT INTO MyTest VALUES ('`$5')" 

genera una stringa

INSERT INTO MyTest VALUES ('$5') 

"INSERT INTO MyTest VALUES ('(5')" 

genera una stringa

INSERT INTO MyTest VALUES ('(5') 

"INSERT INTO MyTest VALUES ('`$(5')" 

genera una stringa

INSERT INTO MyTest VALUES ('$(5') 

"INSERT INTO MyTest VALUES ('`$`(5')" 

genera una stringa

INSERT INTO MyTest VALUES ('$(5') 

Che cosa vuoi inserire? In realtà '$ 5' o il valore della variabile $ 5? Inoltre, hai strane parentesi intorno alla tua variabile $ 5. Non sei sicuro se supponiamo di essere così o non capisci un'altra parte importante delle variabili di PowerShell? Perché questa è una variabile in una stringa "There are $((Get-Process).Count) processes running".

+0

Sto cercando di inserire $ (5. Non chiedermi perché sto spostando i dati da un sistema all'altro. – Russ960

+0

''INSERISCI I VALORI MyTest (" $ (5 ")" "o" "INSERISCI I VALORI MyTest (" $ (5) ")" 'Spero di aver aiutato e non confuso –

+0

stesso errore di parser – Russ960

0

I $ (anyvalue) sono riservati variabili da utilizzare con sqlcmd.exe Cambiare il simbolo $ dal CAR di SQL Server (36):

Invoke-Sqlcmd -Database "nomedatabase" -ServerInstance "hostname" -OutputSqlErrors $ true -Query "INSERT INTO VALORI MyTest (CHAR (36) + '(5)')"

+0

Questo è quello che ho determinato e pubblicato qui in precedenza. – Russ960

2

Tutto quello che dovete fare è disabilitare la ricerca variabili nella invoke-Sqlcmd aggiungendo -DisableVariables. $() viene utilizzato per passare la variabile nelle istruzioni sql.

Invoke-Sqlcmd -InputFile $fileName -ServerInstance $serverInstance -DisableVariables 

Fonte http://msdn.microsoft.com/en-us/library/cc281720.aspx

Problemi correlati