aspas duplas são usadas no sql server e seu comportamento pode ser definido pela opção SET QUOTED_IDENTIFIER ON \ OFF
aspas duplas também são usadas no powershell .
SET QUOTED_IDENTIFIER deve estar ON quando você invocar métodos de tipo de dados XML.
esta é uma visão parcial de um procedimento armazenado que desejo implantar em vários servidores, no entanto, por causa do identificador entre aspas, ou aspas duplas, este caractere - " - não está funcionando no PowerShell, no código visual que uso para implantar.
DECLARE @WebXConfigurationID INT,
@stored_URL VARCHAR(2000), @cur_URL VARCHAR(2000),
@stored_OpsServiceURL VARCHAR(2000), @cur_OPSServiceURL VARCHAR(2000),
@cur_Properties XML;
PRINT 'WebX Configuration: ' + CAST(@WebXConfigurationID AS VARCHAR(20));
IF (ISNULL(@stored_URL, '') <> ISNULL(@cur_URL, ''))
BEGIN
PRINT ' - Base URL needs updating'
END
ELSE
BEGIN
PRINT ' - Base URL does not need updating'
END;
IF (ISNULL(@stored_OpsServiceURL, '') <> ISNULL(@cur_OPSServiceURL, '') AND @cur_OPSServiceURL IS NOT NULL)
BEGIN
PRINT ' - OPS Service URL needs updating'
SET @cur_Properties.modify('replace value of (/properties[1]//OPSServiceURL[1]/text())[1] with sql:variable("@stored_OpsServiceURL")')
END
ELSE
BEGIN
PRINT ' - OPS Service URL does not need updating'
END;
esta é a mensagem de erro:
"' in expression or statement.
At C:\sp_PosRestore.ps1:636 char:114
+ ... ServiceURL[1]/text())[1] with sql:variable("@stored_OpsServiceURL")')
+ ~~~~~~~~~~~~~~~~~~~~~
The splatting operator '@' cannot be used to reference variables in an expression. '@stored_OpsServiceURL' can be used only as an argument to a command. To reference variables in an expression use
'$stored_OpsServiceURL'.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken
O código do Powershell:
$SQLQuery =
"
DECLARE @WebXConfigurationID INT,
@stored_URL VARCHAR(2000), @cur_URL VARCHAR(2000),
@stored_OpsServiceURL VARCHAR(2000), @cur_OPSServiceURL VARCHAR(2000),
@cur_Properties XML;
PRINT 'WebX Configuration: ' + CAST(@WebXConfigurationID AS VARCHAR(20));
IF (ISNULL(@stored_URL, '') <> ISNULL(@cur_URL, ''))
BEGIN
PRINT ' - Base URL needs updating'
END
ELSE
BEGIN
PRINT ' - Base URL does not need updating'
END;
IF (ISNULL(@stored_OpsServiceURL, '') <> ISNULL(@cur_OPSServiceURL, '') AND @cur_OPSServiceURL IS NOT NULL)
BEGIN
PRINT ' - OPS Service URL needs updating'
SET @cur_Properties.modify('replace value of (/properties[1]//OPSServiceURL[1]/text())[1] with sql:variable("@stored_OpsServiceURL")')
END
ELSE
BEGIN
PRINT ' - OPS Service URL does not need updating'
END;
"
Aspas duplas são strings interpoladas, aspas simples são não interpoladas. Como você tem aspas dentro de aspas, você precisa escapar delas. E se você tiver
@
envolvido, ele tentará interpolar.Então você precisa de aspas simples ao redor da string, e quaisquer aspas simples dentro dela precisam ser duplicadas. Veja aqui para mais informações.
A outra opção é uma string Here, cercada por
@'
e'@
.SET QUOTED_IDENTIFIER
não tem nada a ver com nada disso. Isso se refere estritamente ao uso de""
para delimitar identificadores, em vez de strings. E deveria ser sempreON
assim de qualquer forma. Não é relevante para nenhum dos códigos que você postou.Eu alterei esta linha:
para isso (basicamente adicionei o caractere de crase (`) antes das aspas duplas:
tudo funciona bem agora. Backtick funcionou bem
no entanto o que funcionou melhor para mim foi o
@'
e'@
de acordo com a resposta do charlieface