Pergunta

Desculpem o comprimento desta, estou tentando dar um monte de informações para evitar soluções não relevantes.

Meu objetivo é incorporar instrução UPDATE pelo menos 1 em uma instrução SELECT para que eu tenha a chance de atualizar alguns valores computados no instante antes de a instrução SELECT é executado (pense nisso como um gatilho em SELECT). VISTA não está na solução imediata, uma vez que estou constrangido pelo sistema que estou usando (veja abaixo).

Estou personalizar um ERP comercial 3o partido que é fraco em recursos (sistema irá permanecer anônimo - resultado é que você não tenha ouvido falar dele, mas não é casa cresceu tanto). Tem uma facilidade de consulta enlatados onde eu posso usar um texto / GUI para construir uma consulta SELECT. Uma vez que eu salvar uma consulta, os usuários podem clicar na consulta para executá-lo e ver os resultados. ERP é executado no topo MS SQL Server 2000; atualização de versão não está nos cartões para a direita agora. Eu posso escrever o conjunto de recursos que eu preciso fora do ERP em qualquer língua que eu quero, eu tenho feito isso no passado, se as características o justifiquem. Mas a minha comunidade de usuários acha mais fácil quando meus personalizações podem ser feitas no sistema ERP.

A consulta pode ser arbitrariamente complexa, mas o pacote ERP cria a instrução SQL Select em si. Interna para o ERP compilado é algo como isto (este é apenas um palpite!):

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond

O construtor GUI ajuda os usuários novatos construir o fieldList e assim por diante, mas você pode ignorá-lo e escrever as cláusulas de texto, desde que o SQL é válida quando combinados como acima.

Eu não consigo encontrar um encantamento para executar um procedimento armazenado como um efeito colateral de uma instrução SELECT, seja na cláusula select, onde cláusula, etc. Eu realmente não me importo como eu jailbreak do sistema - - um ataque de injeção SQL estável seria bom, contanto que isso não significava que eu tinha que modificar a segurança do próprio activo subjacente sql server. Eu olhei para UDFs, mas você não pode colocar uma instrução UPDATE em uma UDF escalar, e não faz sentido tentar modificar o retorno de uma UDF da tabela (ou não?). Se você pode atualizar a partir de dentro de uma visão, então eu gostaria de ver um exemplo, mas eu percebo que eu posso usar em vista a colunas de computação e que não é a solução que estou procurando. Eu li uma declaração sugestiva on-line sobre a possibilidade de usar algum tipo de XP_ para alcançar este objetivo, mas como a que XP_ ou como fazê-lo, eu não sei.

Esta pergunta não é uma solução, por si só: Atualizando uma tabela dentro de uma instrução SELECT

Foi útil?

Solução

Eu não posso pensar de qualquer maneira de combinar um SELECT com uma actualização em SQL 2000 (embora em 2005 e para cima, a cláusula de saída está disponível). No entanto, parece que você tem três valores de cadeia (fieldList, tableListAndJoins, whereCond) que são concatenados com "SELECT", "de" e "onde", e assumindo que eles não fazer alguma SQL sério injenction-como a detecção de código, você pode ser capaz de kludge juntos algo como isto:

fileList = "NULL where 1 = 0; UPDATE MyTable set MyColumn = 'Whatever' where SomeColumn = 'Criteria'; SELECT MyColumn"

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

[As vírgulas são realmente opcional e pode até não trabalho no SQL 2000 - eles apenas deixar claro onde termina um comando e começa o seguinte.]

A desvantagem desta situação é que você vai receber de volta dois conjuntos de dados. O primeiro será um set de uma coluna vazia (alias que NULL se você quer um nome para a coluna), e os dados que você quer será no segundo set. Outras soluções alternativas pode ser possível, dependendo de como esses três valores são usados ??e como os erros são capturados. (Deixe que a primeira consulta gerar e erro, e espero que a atualização e a segunda consulta passar?)

Outras dicas

Tente usar SQL dinâmico no procedimento armazenado como afirmou na última resposta aqui

Ligado para que o autor original pode obter os créditos que ele / ela merece, e espero que seja útil para você.

E já que você quer selecionar antes a atualização, você pode modificar o sql dinâmico como no do link que eu postei, para fazer o SELECT em primeiro lugar.

Eu não tenho certeza eu entendo as restrições de sua situação, mas você não pode simplesmente executar duas instruções ao mesmo tempo, tais como:

string sql = "update MyTable set x=y;select x from MyTable;";

Será que uma função armazenada ser uma opção? Você pode chamar aqueles mais facilmente (em MySQL, pelo menos) do que procedimentos armazenados -. Em vez de "PROCEDURE_NAME chamada (x)" você pode apenas usar "SELECT FUNCTION_NAME (x)"

Meu palpite com o XP é que você iria escrever seu próprio XP para fazer a atualização e incluí-lo na consulta de alguma forma. Seja ou não que iria trabalhar e onde na consulta ele deve ir, de modo a ser executado antes olhares SQL em seus dados é completamente além de mim.

Parece que você já tentou quase tudo que eu iria tentar. Eu sinto por você porque provavelmente seria bastante fácil para atualizar o estado após você executou o select.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top