Usando o resultado de uma expressão (por exemplo, chamada de function) em uma lista de parâmetros de procedimento armazenado? DoCow
casting de sql sql server sql server 2005 tsql
Obter informações sobre o resultado das unidades de disco no windows7 – sistema de 32 bits Chamando um método de subclass da superclass Golang: Criando um tipo de constante e restringindo os valores do tipo "Git merge -s theirs" necessário – mas eu sei que não existe Google Maps Api v3 – encontre os marcadores mais próximos O que é um domínio de aplicativo .NET? O compilador tem permissão para otimizar as alocações de memory de heap? O que são paramorfismos? Multitões seguros de thread em Java Matriz associativa Java Como o @INC do Perl é construído? (aka Quais são as maneiras de afetar onde os módulos Perl são procurados?) variável de condição – por que chamar pthread_cond_signal () antes de chamar pthread_cond_wait () é um erro lógico? Onde devo colocar o driver JDBC para o pool de conexão do Tomcat? Padrão de construtor em Java efetivo Esta string simples é considerada válida como JSON?
Estou tentando escrever um procedimento armazenado para auxiliar no desenvolvimento do nosso database, mas estou tendo problemas para usá-lo. Por exemplo:
DECLARE @pID int; SET @pID = 1; EXEC WriteLog 'Component', 'Source', 'Could not find given id: ' + CAST(@pID AS varchar);
Isso produz o erro (no SQL Server 2005)
Maneira T-SQL mais eficiente para preencher um varchar à esquerda até um determinado comprimento?
Como passar uma matriz em um procedimento armazenado do SQL Server
Como posso listar todas as foreign keys que fazem referência a uma determinada tabela no SQL Server?
Msg 102, Level 15, State 1, Line 4 Sintaxe incorreta perto de '+'.
Alguém pode me explicar por que minha syntax está incorreta e a maneira correta de resolver esse problema?
Você precisa usar uma variável intermediária. O SQL Server não suporta esse tipo de operação na própria lista de parâmetros, embora ela esteja na lista TODO por alguns anos! (Veja o item Conectar: ​​Use as funções escalares como parâmetros do procedimento armazenado )
A gramática para EXEC é
A documentação atualmente não é clara em um formato aceitável para value mas parece ser apenas expressões "simples", como valores literais ou funções de sistema @@ prefixadas (como @@IDENTITY ). Outras funções do sistema, como SCOPE_IDENTITY() não são permitidas (mesmo aquelas que não exigem parênteses, como CURRENT_TIMESTAMP não são permitidas).
Então, por enquanto, você precisa usar a syntax, como abaixo
DECLARE @pID INT; SET @pID = 1; /*If 2008+ for previous versions this needs to be two separate statements*/ DECLARE @string VARCHAR(50) = 'Could not find given id: ' + CAST(@pID AS VARCHAR(11)) EXEC WriteLog 'Component', 'Source', @string
DECLARE @pID int; declare @IdAsString varchar(100) SET @pID = 1; Select @IdAsString ='Could not find given id: ' + Cast(@pId as varchar(10)) EXEC WriteLog 'Component', 'Source', @IdAsString
Como apontado por Martin, o seguinte apenas se aplica a colunas e não a variables.
Note que eu alterei o seu casting para varchar(10) isso permitirá inteiros maiores que 1 dígito. varchar só permitirá 1 caractere
Você não pode fazer operações nos parâmetros de um procedimento armazenado. Você deve atribuir esse valor a outra variável e depois passá-la para o seu SP.
DECLARE @pID int, @nameId VARCHAR(100); SET @pID = 1; SET @nameId = 'Could not find given id: ' + CAST(@pID AS varchar); EXEC WriteLog 'Component', 'Source', @nameId
DECLARE @pID int; SET @pID = 1; DECLARE @Message NVARCHAR(50); SET @Message = 'Could not find given id: ' + CAST(@pID AS varchar) EXEC WriteLog 'Component', 'Source', @Message;
Tente isso em vez disso …
DECLARE @pID int; SET @pID = 1; DECLARE @message varchar(255); SET @message = 'Could not find given id: ' + CAST(@pID AS varchar) EXEC WriteLog 'Component', 'Source', @message;