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 / 117735
Accepted
popq
popq
Asked: 2015-10-13 04:56:55 +0800 CST2015-10-13 04:56:55 +0800 CST 2015-10-13 04:56:55 +0800 CST

Uso inválido de um operador de efeito colateral 'change_tracking_min_valid_version' dentro de uma função

  • 772

Estou tentando criar uma função envolvendo change_tracking_min_valid_version(object_id), para simplificar as consultas ao usar sinônimos em vez de nomes de tabelas. Algo assim:

CREATE FUNCTION MY_CHANGE_TRACKING_MIN_VALID_VERSION(@synonym VARCHAR(100))
RETURNS BIGINT
BEGIN
    RETURN (SELECT CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(base_object_name))
    FROM sys.synonyms WHERE name = @synonym);
END

Tentei obter o nome do objeto base separadamente, para poder descartar a parte selecionada da instrução de retorno, ou seja

set @retval = CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID(@table_name))

MS SQL Server Management Studio produz este erro:

Msg 443, Level 16, State 1, Procedure MY_CHANGE_TRACKING_MIN_VALID_VERSION, Line 5
Invalid use of a side-effecting operator 'change_tracking_min_valid_version' within a function.

Eu entendo que não posso usar operações com efeitos colaterais em funções, mas como não consigo encontrar nenhuma informação sobre (ou entender por que haveria algum) efeitos colaterais dessa função específica, minha pergunta é:

Quais são os efeitos colaterais de CHANGE_TRACKING_MIN_VALID_VERSION?

(Estou usando o SQL Server 2012.)

sql-server change-tracking
  • 1 1 respostas
  • 2123 Views

1 respostas

  • Voted
  1. Best Answer
    Geoff Patterson
    2015-10-13T06:12:25+08:002015-10-13T06:12:25+08:00

    Como Aaron menciona, essa lógica pode ser feita em uma exibição em vez de uma função. Se você precisar usar uma função, no entanto, uma alternativa pode ser usar sys.change_tracking_tablesem vez de CHANGE_TRACKING_MIN_VALID_VERSION. Ele tem uma min_valid_versioncoluna e, pelo que posso dizer pela documentação, fornece as mesmas informações que você está procurando.

    CREATE FUNCTION MY_CHANGE_TRACKING_MIN_VALID_VERSION(@synonym VARCHAR(100))
    RETURNS BIGINT
    BEGIN
        RETURN (SELECT c.min_valid_version
        FROM sys.synonyms s
        JOIN sys.change_tracking_tables c
            ON c.object_id = OBJECT_ID(s.base_object_name)
        WHERE s.name = @synonym);
    END
    GO
    


    Quais são os efeitos colaterais de CHANGE_TRACKING_MIN_VALID_VERSION?

    Tanto quanto eu posso dizer a partir da documentação, não há nenhum "efeito colateral" que irá afetá-lo significativamente. Como Aaron menciona, você obterá o mesmo erro se tentar usar NEWIDem uma função. Em ambos os casos, eu suspeitaria (mas não tenho certeza) disso NEWIDe CHANGE_TRACKING_MIN_VALID_VERSIONestá acessando e/ou modificando uma estrutura de dados interna (por exemplo, um gerador aleatório no caso de NEWID) e o SQL Server está tendendo a ter cuidado ao rejeitar seu uso em uma função .

    -- This generates the same error
    CREATE FUNCTION testNewIdInFunction()
    RETURNS UNIQUEIDENTIFIER
    BEGIN
        RETURN (SELECT NEWID());
    END
    
    • 3

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

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