2017-04-05 2 views
1

Ma base de données SSDT publier échoue parce qu'il pense à tort une chaîne intégrée fait référence à une variable SQLCMD:SQL Server SSDT publier échoue penser une commande PowerShell utilise une variable SQLCMD

EXEC xp_cmdshell 'powershell.exe $(Get-Date).IsDaylightSavingTime()' 

je peux exécuter manuellement cette déclaration (en SSMS) et obtenir le résultat souhaité (ce qui est malheureusement « vrai »), mais les publier selfs essayant d'analyser l'instruction:

SQL Execution error: A fatal error occurred. The variable Get-Date could not be found.

SQL Execution error: A fatal error occurred. Incorrect syntax was encountered while EXEC xp_cmdshell 'powershell.exe $(Get-Date).IsDaylightSavingTime()' was being parsed.

Comment puis-je obtenir cette déclaration ne manquera pas la publier sans obscurcissement ou l'ajouter à la liste de variables SQLCMD dans le d projet atabase?

(Ou peut-être y a-t-il un moyen plus simple de vérifier si le fuseau horaire du serveur observe DST? Les identificateurs de fuseau horaire aux Etats-Unis disent "Standard" indépendamment de la prévalence sur nos machines.) à GETUTCDATE() n'est pas réalisable.)

Répondre

1

N'avez pas vu cela avant mais encore une fois je n'ai jamais essayé d'appeler powershell de t-sql :).

Le plus simple serait de diviser la chaîne passée à xp_cmdshell en utilisant quelque chose comme ceci:

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/4a07d229-7972-41d1-bd90-ffa979bc7069/how-to-escape-string-that-sqlcmd-thinks-is-a-variable-but-isnt?forum=transactsql

' + CHAR(36) + '

Re une solution plus simple sans Powershell, Je ne sais pas si je pouvais envisager un plus douloureux chose à faire sur t-sql, désolé :)

+0

Cela fonctionne (quoique d'une manière obfusante, préférable de faire simplement '$' + '(stuff)'), mais il doit être réglé dans une variable qui est un VARCHAR (et aussi pas VARCHAR (MAX) mais une longueur finie). Merci. – Elaskanator