Você tem algumas perguntas diferentes aqui.
P: Quais são as funções SQL padrão do ANSI?
As funções padrão ANSI são AVG, COUNT, MIN, MAX. Eles são cobertos pelo padrão ANSI de 1992 , mas essa é uma leitura seca e chata.
P: As funções SQL padrão ANSI alteram os dados no banco de dados?
Não. Você pode usá-los para alterar dados - por exemplo, posso dizer:
INSERT INTO dbo.MyReport SELECT MAX(SalespersonRevenue) FROM dbo.Sales
Mas, por si só, apenas o uso de um AVG, COUNT, MIN, MAX, etc, não deve alterar os dados permanentemente no seu banco de dados.
P: O padrão ANSI permite que eu escreva minhas próprias funções?
Sim, mas a implementação exata varia de fornecedor para fornecedor. As funções que você escreve podem estar em conformidade com o padrão de linguagem ANSI, mas o que você faz dentro da sua função pode ser horrivelmente horrível, como a criação de efeitos colaterais.
- Ao discutir o comportamento pretendido , é possível obter uma resposta multiplataforma.
- Ao discutir efeitos colaterais , não é.
P: Posso criar minha própria função para gravar dados?
Com certeza, se você é criativo. Eu sou um cara do Microsoft SQL Server, então vou me concentrar nessa plataforma. A página de função do Books Online diz:
As funções definidas pelo usuário não podem ser usadas para executar ações que modificam o estado do banco de dados.
Para o qual eu digo:
Você não é meu pai de verdade.
Então, aqui está como eu violaria as regras. Atenção: idéias muito ruins seguem.
- Em sua função, consulte uma nova tabela criada especialmente para esse propósito maléfico e, em seguida, crie algo que observe a tabela para instruções de seleção e, em seguida, inicie uma ação (Eventos Estendidos, Auditoria ou Rastreio do Profiler). Você pode conectar um tipo de dispositivo de Rube Goldberg para executar um trabalho com base nessas instruções selecionadas.
- Na função, chame o código CLR - você pode até chamar um serviço da web . Esse serviço da Web pode muito bem enviar dados de volta para seu próprio banco de dados.
- Na função, chame xp_cmdshell e faça algo através do prompt de comando. (HT @AaronBertrand nos comentários.)
Todos esses exemplos têm enormes desvantagens na forma de desempenho e consistência transacional. Você acabou de perguntar se isso poderia ser feito teoricamente e a resposta é sim. Eu nunca usaria nenhum desses no meu próprio código - eu recuaria e perguntaria: "Qual é o objetivo de negócios que estou tentando alcançar aqui e existe uma maneira de fazê-lo para obter desempenho e consistência transacional? ? " Se você quiser um conselho específico sobre isso, faça uma pergunta separada sobre a pilha com detalhes.