0
votes

Tables Temps dans Delphi Requête

J'essaie d'y union dans la table Temp. Voyez-vous une mauvaise syntaxe ici? Lorsque je l'exécute, cela ne montre aucun problème, mais lorsque j'essaie de faire référence à cette requête, il est indiqué "Nom de la table non valide # TEMP_TRANS_13" (J'utilise MSSQL).

select * into #temp_trans_13 from (
select 
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = :jahr
and   periode = 12
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = :jahr
and   periode = 13
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste

where
      Jahr = :jahr 
and   periode = 14
and   buchungskreis = :bkr
and   konto_nr between '200000' and '999999')t 


19 commentaires

La requête fonctionne-t-elle dans SSMS?


Je ne pense pas que je l'ai accès dans mon travail: /. Je ne peux vérifier que sur Fire Dac Explorer et là, il montre que les paramètres sont indéfinis


@nolaspeaker: Pour moi, SSMS 2014 ne semble pas aimer le ... (sélectionnez * de quoi que ce soit) - il se plaint de la parenthèse de fermeture)


@Martyna Eh bien c'est le premier problème!


Je suis assez nouveau à toutes ces choses, alors je ne suis donc pas familier à tout ce genre de choses (encore!). : P


@ Jichałmurek et c'est le deuxième problème.


@nolaspeaker: En effet, c'est pourquoi j'ai ajouté la balise SQL-Server, en espérant que cela pourrait attirer un spécialiste.


@ Jichałmurek La question n'a rien à voir avec Delphi, c'est pur SQL. Cela signifie que vous devez installer et utiliser des SSMS ou des annonces pour essayer ces choses. Une table temporaire est temporaire - quelqu'un doit le créer. Une table commençant par un # n'existe que dans la connexion actuelle, ce qui signifie votre code doit le créer.


@ JichałMurek Vous les avez trouvés. Le problème est la fermeture manquante) à la fin. L'autre est que vous ne pouvez pas utiliser le même nom de paramètre sur et sur.


Thing drôle, c'est que j'ai utilisé cela ... (sélectionnez * de quoi que ce soit) sur certains projets précédents et qu'il y ait fonctionné sans problèmes. Cela me surprend


Oh, mais le projet que j'écris à Delphi. Il utilise simplement SQL Server. Excusez-moi de ne pas avoir été clair.


Cette sous-requête semble renvoyer les mêmes données de la même table pour différentes combinaisons de critères. Il pourrait être remplacé par une requête Single combinant toutes les combinaisons avec ou. Union est une opération coûteuse car elle doit renvoyer des valeurs distinctes.


@Nolaspaseaker: Non, c'est la fermeture ) que SSMS se plaint, ce que je dois dire que je me plie parce que je m'attendrais à ce que la construction fonctionne.


@Panagiotikanavos: "Quelqu'un doit le créer". Eh bien, la requête est censée la créer. Dans tous les cas, l'OP utilise Delphi, qui est livré avec des outils intégrés parfaitement bons d'interrogation de DB, donc pas besoin de SSMS.


@Martyna Si le serveur se plaint des tables manquantes, cela signifie qu'il y avait une tentative de utiliser cette table avant de créer. Très probablement dans certains codes, l'OP n'a pas publié ici. Un ) manquant entraînerait une erreur différente. Cette requête est assez longue qu'il est difficile de voir ce qu'il fait - ou à quel point il est répétitif


@Martyna La raison pour laquelle tout le monde demande fonctionne-t-il dans SSMS? D'abord dans de telles questions consiste à isoler s'il s'agit d'une erreur de programmation ou d'une mauvaise requête. Si quelque chose ne fonctionne pas lorsqu'il est exécuté directement contre la base de données, cela ne fonctionnera pas dans une IDE ou au moment de l'exécution.


@PanagioSkanavos: Eh bien, avec la requête simplifiée, j'utilise Select * dans #mytemp à partir de (sélectionnez * à partir de table1) , il s'agit de la fermeture ) que SSMS se plaint de , pas une table manquante. BTW, je suis parfaitement conscient de votre point sur SSMS.


J'ai réintégré la balise Delphes pour que le Q ne disparaisse pas de la vue de ses adeptes.


BTW, personne n'a demandé la question évidente, nommément le SQL à l'intérieur de votre ( ... ) exécute et produit les résultats que vous attendez.


3 Réponses :


0
votes

Cela corrigera vos problèmes:

declare 
   @bkr varchar(10),
   @jahr int

set @bkr = :bkr
set @jahr = :jahr

select T.* 
into #temp_trans_13 
from     
(
select 
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = @jahr
and   periode = 12
and   buchungskreis = @bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste
where
      Jahr = @jahr
and   periode = 13
and   buchungskreis = @bkr
and   konto_nr between '200000' and '999999'
union
select
      periode,
      konto_nr as ktonr,
      konto_kurztext as ktobez,
      soll_periode - haben_periode as SaldoMonat,
      soll_saldo - haben_saldo as SaldoJahr

from
      sap_SuSa_liste

where
      Jahr = @jahr 
and   periode = 14
and   buchungskreis = @bkr
and   konto_nr between '200000' and '999999'
) T


10 commentaires

Eh bien, merci pour un effort mais le problème est toujours là. ; (


Quel problème exactement?


@ Jichałmurek quel problème et quoi exactement avez-vous essayé? Vous ne serait pas obtenir le message d'erreur que vous avez publié de cette requête ou tout manquant ) . Très probablement, vous obtenez une erreur de la requête suivante qui ne peut pas trouver la table temporaire


@ Jichałmurek Vous devez signaler le problème exact que vous rencontrez, des mots exacts, si vous souhaitez une aide supplémentaire avec cela.


Alors. Il y a une séquence de querres qui se rapportent à eux-mêmes. Et ils fonctionnent correctement en dehors de ma dernière requête qui ne refuse-t-elle que j'ai décrit parce qu'elle montre une erreur "Nom de la table non valide, blablabla"; /


Je vais éditer ma réponse à celle-ci, il fait à nouveau la table # temp_trans_13 .


Jésus c'est une situation vraiment stressante. @Panagiotikanavos Oui C'est le problème


Insérer dans hm_sap_fibu_trans Sélectionnez Ktonr, Ktobez, Somme (Saldomonat) comme Saldomonat, Somme (Saldojahr) comme Saldojahr de # Temp_trans_13 Group de Ktonr, Ktobez Je ne sais pas comment faire ce code plus lisible. Ceci est un texte qui est dans la dernière requête qui a un problème


Cela devrait. Mais en quelque sorte ce n'est pas le cas;


@ Jichałmurek alors maintenant tu nous dis! :-) Assurez-vous que l'étape précédente est comme ma réponse ci-dessus, alors la requête que vous avez donnée dans les commentaires tout à l'heure actuelle, trouvera également le # temp_trans_13 .



3
votes

On dirait que la requête entière pourrait être simplifiée pour: xxx

Union renvoie des valeurs distinctes, ce qui signifie que même si l'optimiseur de requête SQL Server était suffisamment intelligente pour éviter exécuter n requêtes, il serait toujours avoir à trier et à regrouper les données pour éliminer les doublons.

Si une élimination en double est requise, on peut ajouter distinct à la Sélectionnez la clause

Tableaux temporaires

Les tables temporaires sont temporaires. Ils n'existent que pour la durée d'une seule connexion. Ceux qui ont un seul préfixe # ne sont visibles que sur la connexion qui les a créées.

l'erreur Nom de la table non valide # TEMP_TRANS_13 ne peut être soulevé que lorsque Une autre requête tente d'utiliser cette table et de ne pas le trouver, que ce soit parce qu'il n'a pas encore été créé ou parce qu'il a été créé dans une connexion différente.

Pour utiliser une table Temp d'une autre connexion, il faut créer un Table temporaire globale à l'aide de ## en tant que préfixe.


4 commentaires

Je suis à peu près sûr que toutes ces réponses fonctionneraient, mais cela ne fonctionnerait pas dans mon Delphi. Mon travail consiste à retaper du système total de la machine virtuelle XP Delphi 5 à Delphi 10, alors peut-être qu'un autre code pourrait être archaïque.


Cela n'a rien à voir avec Delphi. Avez-vous essayé d'exécuter vos requêtes directement contre la base de données? L'erreur que vous avez signifie que certains Autres requêtes ont essayé d'utiliser cette table et ne l'ont pas trouvé. Comment avez-vous appelé l'autre requête? L'avez-vous appelé dans le même lien ou un autre? # temp_trans_13 n'existe que pendant la durée d'une seule connexion et est uniquement visible à l'intérieur de cette connexion.


Alors. Oui, il est connecté à la même fdconnection. J'ai appelé Query 'Select * à partir de # temp_trans_13'


Aussi dans FD Explorer, il ne le voit pas



2
votes

Dans une situation comme celle-ci, je trouve utile d'essayer une requête qui fait bouillir le problème jusqu'à son essentiel.

Utilisation de SSMS 2014, j'ai un Table1 code> qui consiste en un seul int code> Colonne nommée ID code>. p>

si je tente p> xxx pré>

i obtenir l'erreur p >

msg 102, niveau 15, état 1, ligne 1 Syntaxe incorrecte près ')'. P> blockQuote>

I Obtenir le même message d'erreur si je tente p> xxx pré>

Cependant, après l'exemple de la section r. En utilisant une table dérivée forte> de la transactSQL Docs Cette requête p> xxx pré>

La requête exécute correctement et produit le jeu de résultats à colonne attendu. P>

En outre, exécutant P>

select * into #mytemp from (select * from table1) as derivedtable


0 commentaires