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 / 968
Accepted
goric
goric
Asked: 2011-01-29 05:25:05 +0800 CST2011-01-29 05:25:05 +0800 CST 2011-01-29 05:25:05 +0800 CST

Por que não posso usar newid() em uma função com valor de tabela definida pelo usuário?

  • 772

Recentemente, descobri que o SQL Server 2005 não permite o uso de newid()funções definidas pelo usuário. Por que é isso?

Eu tenho uma solução alternativa que atende às minhas necessidades, então não estou procurando maneiras de contornar isso. Estou curioso para saber por que os designers tomariam essa decisão.

sql-server-2005
  • 3 3 respostas
  • 2864 Views

3 respostas

  • Voted
  1. Best Answer
    John Bledsoe
    2011-01-29T05:32:57+08:002011-01-29T05:32:57+08:00

    O SQL Server permite apenas que funções determinísticas sejam usadas em funções definidas pelo usuário. Como o valor de NEWID() não é determinístico, ele não pode ser usado. Você descobrirá que a mesma coisa é verdadeira com GETDATE() e qualquer outra função não determinística.

    Não estou qualificado para responder por que eles tomariam essa decisão. Isso também me irrita, mas tenho certeza de que a equipe SQL da MS não é desleixada.

    EDIT: Acontece que meu conhecimento sobre GETDATE () está desatualizado. Como diz o comentarista, você pode usar GETDATE() nas funções do SQL Server 2005 em diante. No entanto, você ainda não pode usar NEWID (), que acredito ter a ver com a mesma restrição de não determinismo.

    • 5
  2. Riley Major
    2017-07-11T10:13:31+08:002017-07-11T10:13:31+08:00

    A documentação NEWID () da Microsoft não explica, mas concordo que o motivo provável está relacionado ao comentário de @Payload em outra resposta :

    NEWID() é uma função não determinística, que depois de 2005 é permitida em UDF, mas, como NEWID altera alguns dos contadores e valores internos dentro da estrutura do banco de dados, é considerado um 'efeito colateral' e como UDFs não podem ter efeitos colaterais não são permitidos no UDF, o mesmo vale para RAND (), pois cada chamada para RAND altera o valor da semente no funcionamento interno do MSSQL e isso novamente é considerado um efeito colateral. GETDATE()/GETUTCDATE() e as listas de funções permitidas não têm efeitos colaterais, portanto são permitidas.

    Para aqueles dispostos a arriscar, veja a solução alternativa de @dio-phung sugerida em outro comentário na mesma resposta :

    @DavidSpillett: Para sua informação, você pode contornar a proibição de newid() lendo em uma exibição: CREATE VIEW vw_NewGuid AS SELECT NEWID() AS new_guid . Em seguida, no seu UDF, você pode fazer: SELECT new_guid FROM vw_NewGuid

    Observe o cuidado de @david-spillett:

    @Dio: Eu ficaria muito cauteloso com soluções alternativas que envolvem enganar o mecanismo de que algo é determinístico quando na verdade não é. Você está usando um bug que pode ser corrigido posteriormente (talvez deva detectar que a coluna na exibição não é determinística e eles corrigirão isso no SQL Server {Nextversion}) ou contando com "comportamento indefinido" que da mesma forma não é garantido que funcionará da mesma forma em versões posteriores (ou mesmo em sua versão atual, se outras circunstâncias mudarem na consulta).

    Essa solução alternativa/truque é oferecida em várias outras respostas .

    • 1
  3. Miles D
    2011-01-29T05:35:18+08:002011-01-29T05:35:18+08:00

    Acredito que a resposta é que NEWID() é uma função não determinística - ou seja, tem efeitos colaterais. As funções definidas pelo usuário não podem ter efeitos colaterais.

    • 0

relate perguntas

  • Restrições exclusivas em colunas anuláveis ​​no SQL Server 2005

  • Como alterar a ordem de disparo dos Triggers?

  • Alguém usou o modo sqlcmd na prática? [fechado]

  • Como altero o nome da instância no MS SQL 2005 sem instalar uma nova instância?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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