Bonjour,
comment faire la concaténation de deux variables pour former le nom d'une table sous transact sql?
Merci d'avance.
Bonjour,
comment faire la concaténation de deux variables pour former le nom d'une table sous transact sql?
Merci d'avance.
Avec + ou CONCAT
A +
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
* * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *
Pouvez vous me dire qu'est ce qui ne marche pas dans ma requête
Code : Sélectionner tout - Visualiser dans une fenêtre à part select * from (select concat('TPaie',2017) )
Pour ce genre de besoin, vous ne pouvez pas utiliser CONCAT, il faut utiliser du SQL DYNAMIQUE
Cf. http://sheikyerbouti.developpez.com/execute_immediate/
Voila le code que j'utilise ,j'aimerai savoir comment je peux affecter le résultat qui s'affiche par print dans une variable pour l'utiliser comme nom d'une table .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 declare @vartp nvarchar(6) declare @varann nvarchar(4) declare @res nvarchar(10) set @vartp='TPaie' set @varann='2017' set @res=@vartp+@varann print(@res)
Bonjour,
Pour cela il te faudra, comme cela a été évoqué ci-dessus par escartefigue, utiliser le "SQL Dynamique"
Le lien indiqué ci-dessous traite du sujet mais les exemples utilisent principalement la syntaxe ORACLE.
Ici, nous somme sur le forum SQL Server. Pour SQL Server, il te faudra utiliser la procédure système sp_executesql.
Tu devras écrire quelque chose comme ceci :
Code 'SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 declare @vartp nvarchar(6) declare @varann nvarchar(4) declare @res nvarchar(10) declare @sqlStmt nvarchar(max); -- nouvelle ligbe (nouvelle variable à déclarer) set @vartp='TPaie' set @varann='2017' set @res=@vartp+@varann print(@res) set @sqlStmt = N'SELECT * FROM dbo.'+@res; -- nouvelle ligne EXECUTE sp_executesql @SqlStmt; -- nouvelle ligne
A+
Bonjour,
J'utilise des curseurs à l'intérieur d'une fonction et je veux mettre à la place des noms des tables TPaie2017 et Etatemp2017 deux variables, un qui prend 'TPaie' et l'autre prend '2017'.
Comment faire la concaténation entre les deux variables dans l'exemple ci-dessous?
Code : Sélectionner tout - Visualiser dans une fenêtre à part declare curt2 cursor for Select TPaie2017.MEmploye,EtatEmp2017.CFonctio From TPaie2017 inner Join EtatEmp2017 On EtatEmp2017.MEmploye=TPaie2017.MEmploye
Bonjour,
Les fonctions scalaires sont par nature déterministes, aussi, l'utilisation du SQL Dynamique est strictement interdite dans les fonctions scalaires, du moins classiques.
Sinon, dans une procédure stockée, tu pourrais écrire quelque chose comme ceci :
A+
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 declare @curt2OUT cursor; declare @SqlStmt nvarchar(max) ,@MEmploye ??? -- précises le type (?) ,@CFonctio ??? -- précise le type (?) declare @vartp nvarchar(6) declare @varann nvarchar(4) declare @tpTableName nvarchar(128) -- Nom de la table "Type Paie" declare @eeTableName nvarchar(128) -- Nom de la table "Etat Employé" set @vartp='TPaie' set @varann='2017' set @tpTableName=@vartp+@varann -- Exemple 'TPaie2017' set @eeTableName= N'Etatemp'+ @varann; -- Exemple 'EtatEmp2017' set @SqlStmt = N'set @Curt2IN = cursor local forward_only read_only for' + N' Select ' + @tpTableName+'.MEmploye' + N', '+ @eeTableName + N'.' + N'.CFonctio' + N' From dbo.' + @tpTableName + N' inner Join dbo.' + @eeTableName + N' On ' + @eeTableName +N'.MEmploye' + N'=' + @tpTableName + N'.MEmploye' + N' open @Curt2IN;' PRINT @SqlStmt exec sys.sp_executesql @SqlStmt ,N'@Curt2IN cursor output' ,@curt2OUT output fetch next from @curt2OUT into @MEmploye, @CFonctio while (@@fetch_status = 0) begin /* ..... Insère ton traitement ici ... .. */ fetch next from @curt2OUT into @MEmploye, @CFonctio end close @curt2OUT deallocate @curt2OUT
Bonjour,
Les fonctions scalaires ne sont pas forcément déterministes, d'ailleurs ont peut renvoyer un simple RAND() ou un GETDATE()En revanche, toute modification de l'état de la base de données (données elle même ou options) y est interdite.
Donc pas de DELETE, INSERT ou autre UPDATE, pas d'instruction SET modifiant les paramètres, mais pas non plus d'appel a des procédures stockées ou de SQL Dynamique, qui pourraient exécuter de telles instructions
Merci aieeeuuuuu, pour tes précisions complémentaires, toujours aussi instructives. Je suis d'accord avec toi, sauf pour la fonction RAND().
GETDATE() est bien autorisée dans une fonction, même si elle rend effectivement la fonction non déterministe. En revanche, et sauf erreur de ma part, ce n'est pas vraie pour la fonction RAND(). Je viens de faire quelques tests sous SQL Server 2008 R2 et SQL Server 2014 et cela ne fonctionne pas. On obtient le message ci-après:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Msg 443, Level 16, State 1, ... Utilisation non valide d'un opérateur présentant des effets secondaires 'rand' dans une fonction.
Sinon pour le reste tu as raison une fonction scalaire peut être non déterministe. Pour le vérifier :
qui renvoie respectivement 1 ou 0 selon que la fonction est déterministe ou non.
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part SELECT OBJECTPROPERTYEX(OBJECT_ID('dbo.MafonctionScalaire'), N'IsDeterministic');
A+
en effet, le RAND ne passe pas directement dans une fonctions, merci pour la correction.
chose amusante à ce sujet, on peut contourner comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 CREATE VIEW dbo.RANDOM AS SELECT RAND() AS Randomchose encore plus amusante, on obtient des comportements différents, avec des valeurs identiques lors de l'utilisation directe de la fonction RAND(), mais des valeurs différentes si l'on passe par la fonction dbo.R :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 CREATE FUNCTION dbo.R() RETURNS FLOAT AS BEGIN DECLARE @ret AS FLOAT; SELECT @ret = Random FROM dbo.RANDOM; RETURN @ret; END
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT RAND() FROM sys.objects0,289417900117308 0,289417900117308 0,289417900117308 0,289417900117308 0,289417900117308 0,289417900117308 0,289417900117308 ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT dbo.R() FROM sys.objects0,766857731568752 0,812636701653635 0,795330303512908 0,0529166055365246 0,0657088290183416 0,633315273593024 0,468770243897288 ...
Partager