AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 130190
Accepted
AcePL
AcePL
Asked: 2016-02-24 07:20:06 +0800 CST2016-02-24 07:20:06 +0800 CST 2016-02-24 07:20:06 +0800 CST

Xquery, insert, Trigger e nenhum lugar para espremer o procedimento armazenado

  • 772

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 @stringmanipulaçã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?

stored-procedures sql-server-2012
  • 1 1 respostas
  • 262 Views

1 respostas

  • Voted
  1. Best Answer
    wBob
    2016-02-24T16:05:28+08:002016-02-24T16:05:28+08:00

    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:

    USE tempdb
    GO
    
    DECLARE @xml XML
    DECLARE @someString VARCHAR(50) = 'test string'
    
    SET @xml = (
    SELECT
        object_id AS "@object_id", 
        SCHEMA_NAME(schema_id) AS "@schemaName", 
        name AS "@tableName"
    FROM sys.tables t
    FOR XML PATH('table'), ROOT('tables'), TYPE
    )
    
    SELECT 'before 1' s, DATALENGTH(@xml) dl, @xml x
    
    -- Use sql:variable to add a variable into the XML
    SET @xml.modify('insert element someData{sql:variable("@someString")} into (tables/table)[1]')
    
    SELECT 'after 1' s, DATALENGTH(@xml) dl, @xml x
    
    
    -- Use sql:column to add a column from a table into the XML
    DECLARE @t TABLE ( object_id INT PRIMARY KEY, identity_col SYSNAME )
    
    INSERT INTO @t ( object_id, identity_col )
    SELECT object_id, name
    FROM sys.identity_columns
    
    IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
    
    SELECT 
        t.c.value('@object_id', 'INT') object_id,
        t.c.query('.') tableData
    INTO #tmp
    FROM @xml.nodes('tables/table') t(c)
    
    
    
    SELECT 'before 2' s, DATALENGTH(tableData) dl, tableData
    FROM #tmp
    
    UPDATE t
    SET tableData.modify('insert element identCol{sql:column("ids.identity_col")} into (table)[1]')
    FROM #tmp t
        CROSS APPLY @t ids
    
    SELECT 'after 2' s, DATALENGTH(tableData) dl, tableData
    FROM #tmp
    
    • 1

relate perguntas

  • Como retornar um CTE como REFCURSOR de um procedimento armazenado Oracle?

  • Como descubro se existe um procedimento ou função em um banco de dados mysql?

  • O que é SQL Server "Denali"? O que há de novo?

  • Alguém está usando o recurso do SQL Server para criar grupos de stored procedures diferenciadas por número?

  • SQL dinâmico em rotinas armazenadas do MySQL

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve