Créer, supprimer et insérer une table temporaire dans une fonction définie par l'utilisateur
Je suis en train de créer une fonction, comme par mes exigences.
Mais, quand suis-la création ou de la baisse #tempTable
, il donne une erreur:
usage incorrect d'un côté-accomplissement de l'opérateur "chute d'objet" dans une fonction
Ma compréhension est que nous ne pouvons pas avoir create
, drop
ou insert
opérations sur #temptable
dans une fonction.
Est-ce exact?
My SQL:
CREATE FUNCTION [dbo].[RT_ResultFunction]
(
Id VARCHAR(4000)
)
RETURNS @RT_ResultFunction TABLE
(
Id VARCHAR(20)
, Name varchar(20)
,Balance Int
)
AS
BEGIN
IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL
DROP TABLE #tempTable
SELECT Id, COUNT(Balance)
INTO #tempTable
'Balance' FROM Table1
INSERT @RT_ResultFunction
SELECT T1.ID,T1,NAME,T2,Balance
FROM Table2 T1,
#tempTable T2
WHERE T1.ID = T2.ID
RETURN
END
Peu confus au sujet de votre SQL. Comment choisissez de #tempTable après que vous avez abandonné - son jamais recréé.
Veuillez trouver les mises à jour post
Si vous voulez de l'aide pour résoudre ce problème, veuillez expliquer le point de la #temptable l'intérieur de la fonction. Aussi de quoi faire avec l'Id de paramètre.
S'il vous plaît arrêter à l'aide de jointures implicites. Ils sont un SQl antipattern.
Veuillez trouver les mises à jour post
Si vous voulez de l'aide pour résoudre ce problème, veuillez expliquer le point de la #temptable l'intérieur de la fonction. Aussi de quoi faire avec l'Id de paramètre.
S'il vous plaît arrêter à l'aide de jointures implicites. Ils sont un SQl antipattern.
OriginalL'auteur Software Enginner | 2012-06-29
Vous devez vous connecter pour publier un commentaire.
Qui est correct, vous ne pouvez pas avoir côté d'effectuer des relevés:
À partir d'ici: http://msdn.microsoft.com/en-us/library/aa175085(v=sql.80).aspx
Que vous pouvez trouver, même sans votre
DROP
déclaration, c'est que toute tentative d'accès à une table temp vous donnera le message (comme unSELECT ... INTO #TMP
):@Dems points, vous pouvez utiliser les variables de table. Parce que ce sont des variables, ils sont limités à l'intérieur de la fonction, et par conséquent ne sont pas secondaires effectuer.
Votre fonction peut exécuter en tant qu':
Pas testé ou quoi que ce soit, mais vous obtenez l'essentiel.
Bon mis à jour avec plus d'informations.
Après j'ai lu la Documentation MSDN, je me suis demandé : est-il possible de modifier les données réelles à partir d'une table (
INSERT
/UPDATE
/DELETE
) par l'appel d'uneStored Procedure
dans votrefunction
? Je suppose que vous ne pouvez pas, mais je préfère être sûr qu'une erreur se soit produite. Pourriez-vous me dire si vous le savez ? 🙂Vous ne pouvez pas appeler des procédures stockées à partir d'un fichier UDF parce que les procédures stockées PEUVENT causer des effets secondaires et les fonctions ne sont pas autorisés à.
OriginalL'auteur Jon Egerton
Je n'ai aucune idée de pourquoi vous avez besoin d'une table #temp dans cette fonction, ou pourquoi il est un multi-déclaration TVF en premier lieu. La suite sera beaucoup plus efficace (même si je ne comprends pas le but de la
@Id
paramètre):Que Jon l'a souligné, je pense il pourrait aussi être ré-écrite comme suit, et c'est en fait la façon dont j'ai commencé à l'écrire, mais je n'ai aucun moyen de confirmer si l'un de ces renvoie en fait les données que vous essayez de retour:
L'ID et le Nom provenant de tables différentes. Je ne connais pas le schéma ou les données donc j'ai essayé de rester fidèle à l'original de la requête.
OriginalL'auteur Aaron Bertrand
Supprimer # au lieu d'utiliser @
Je n'ai pas testé autre aspect
OriginalL'auteur user3231262