Eu tenho um procedimento armazenado, que é, basicamente, xquery puxando dados de xml e inserindo-os em várias tabelas. Depois de inserir na última das tabelas mencionadas, o gatilho é acionado e, em seguida, esses dados são usados para fazer mais manipulação de dados.
tudo vai bem até um ponto em que tenho que fazer cortes e emendas sérios. Por sério, quero dizer adicionar a uma string os sobrenomes e nomes dos clientes selecionados de várias linhas e colunas de uma tabela. anteriormente, isso era feito por meio de software de terceiros, que fragmentava o xml e chamava o procedimento armazenado do SQL Server com a referida manipulação de string para cada linha do conjunto de dados derivado do xml.
Agora que estou usando Xquery, isso não está disponível - inserir de selecionar de xquery não permitirá reutilizar o referido procedimento armazenado e não posso usar o bit de código para fazer a manipulação em xquery.
Exemplo de código para manipulação de string:
select top 100 @string = @string + Surname +' & '
from usr_bie
where ref = @ref and code = @code and type = 'Client' order by mc desc
Select @string = left(@string,len(@string)-2) + ', '
Select top 100 @string = @string + FirstName +
(case
when middlename is not null
then ' ' + Middlename
else '' end
) + ' & '
from usr_bie
where ref = @ref and code = @code and type = 'Client' order by mc desc
Select @string = left(@string,len(@string)-2)
Eu preciso atribuir o resultado do acima ao valor em xquery:
Insert into a (col1, col2,...)
Select
t.c.value('(../Ref)[1]','varchar(50)') as col1
....
from @xml.nodes(...)t(c)
Entendo que Xquery insere várias linhas, portanto, não há uma maneira fácil de chamar o antigo procedimento armazenado para cada linha, mas OTOH também não consigo fazer minha @string
manipulação como acima.
Existe uma solução que eu não estou familiarizado?
Eu converti o código de manipulação de string para funcionar (novamente), e desta vez funcionou. Mas ainda há trabalho a ser feito nos outros valores do xml ... Então a pergunta é: existe uma maneira de fazer RBAR com xquery, para que eu possa manipular os dados de várias maneiras conforme necessário? Como está agora, Insert está sendo feito em várias linhas, então não posso fazer condição simples: if @variable = somevalue begin...
, onde @variable é passado como um parâmetro de procedimento armazenado? E há algum sentido em seguir o caminho lento (rbar), em vez de - como @Duffy sugeriu - ir para o CTE?
Você está familiarizado com sql:column e sql:variable ? Eles permitem que você manipule XML com variáveis externas ou tabelas? Trabalhe com esta demonstração e examine os diferentes resultados 'antes' e 'depois' para ver se eles podem ajudá-lo: