Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requêter avec db_id plutôt qu'avec le nom de la bdd

10 réponses
Avatar
Hervé REIGNOUX
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join AdventureWorks.sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose pour une
table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname, 2),
@table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' + @table +
']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join [QUOIDONC?].sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?

10 réponses

Avatar
Fred BROUARD
SELECT *
FROM MonAutrebase. INFORMATION_SCHEMA.COLUMNS

évitez d'utiliser des vues systèmes quand il existe des objets normatifs !

Pour savoir si la colonne est calculée COLUMNPROPERTY en combinant OBJECTID.

A +

Hervé REIGNOUX a écrit :
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join AdventureWorks.sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose pour une
table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname, 2),
@table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' + @table +
']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join [QUOIDONC?].sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Avatar
Hervé REIGNOUX
Merci pour votre réponse.
Je m'attellerai à suivre votre conseil !
Pourriez-vous néanmoins m'aider - si possible - sur la question de savoir
comment invoquer ces « objets normatifs ».
Exemple :
declare @bdd sysname
set @bdd = 'MonAutrebase'
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Merci d'avance et bonne journée...


"Fred BROUARD" a écrit dans le message de news:

SELECT *
FROM MonAutrebase. INFORMATION_SCHEMA.COLUMNS

évitez d'utiliser des vues systèmes quand il existe des objets normatifs !

Pour savoir si la colonne est calculée COLUMNPROPERTY en combinant
OBJECTID.

A +

Hervé REIGNOUX a écrit :
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose pour
une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname, 2),
@table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' + @table +
']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join [QUOIDONC?].sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************


Avatar
Fred BROUARD
declare @bdd sysname, @SQL NVARCHAR(4000)
set @bdd = 'MonAutrebase'
SET @SQL = 'SELECT * FROM ' + @bdd + '.INFORMATION_SCHEMA.COLUMNS'
EXEC (@SQL)

A +

Hervé REIGNOUX a écrit :
Merci pour votre réponse.
Je m'attellerai à suivre votre conseil !
Pourriez-vous néanmoins m'aider - si possible - sur la question de savoir
comment invoquer ces « objets normatifs ».
Exemple :
declare @bdd sysname
set @bdd = 'MonAutrebase'
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Merci d'avance et bonne journée...


"Fred BROUARD" a écrit dans le message de news:

SELECT *
FROM MonAutrebase. INFORMATION_SCHEMA.COLUMNS

évitez d'utiliser des vues systèmes quand il existe des objets normatifs !

Pour savoir si la colonne est calculée COLUMNPROPERTY en combinant
OBJECTID.

A +

Hervé REIGNOUX a écrit :
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose pour
une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname, 2),
@table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' + @table +
']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join [QUOIDONC?].sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?



--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Avatar
Hervé REIGNOUX
Merci pour votre acharnement à vouloir me répondre :)
Malheureusement, comme indiqué précédemment :
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?


Ma demande est peut-être inpossible à satisfaire ?
(J'ai re-cherché depuis, en vain :(


"Fred BROUARD" a écrit dans le message de news:

declare @bdd sysname, @SQL NVARCHAR(4000)
set @bdd = 'MonAutrebase'
SET @SQL = 'SELECT * FROM ' + @bdd + '.INFORMATION_SCHEMA.COLUMNS'
EXEC (@SQL)

A +

Hervé REIGNOUX a écrit :
Merci pour votre réponse.
Je m'attellerai à suivre votre conseil !
Pourriez-vous néanmoins m'aider - si possible - sur la question de savoir
comment invoquer ces « objets normatifs ».
Exemple :
declare @bdd sysname
set @bdd = 'MonAutrebase'
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Merci d'avance et bonne journée...


"Fred BROUARD" a écrit dans le message de
news:
SELECT *
FROM MonAutrebase. INFORMATION_SCHEMA.COLUMNS

évitez d'utiliser des vues systèmes quand il existe des objets normatifs
!

Pour savoir si la colonne est calculée COLUMNPROPERTY en combinant
OBJECTID.

A +

Hervé REIGNOUX a écrit :
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose
pour une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname, 2),
@table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' + @table
+ ']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join [QUOIDONC?].sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?



--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************


Avatar
bruno reiter
peut etre du SQL dynamique peut aider :

declare @db sysname
set @db = 'adventureworks'
exec ('select * from ' + @db +'.sys.tables')

BR

"Hervé REIGNOUX" wrote in message
news:49424b66$0$6823$
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose pour
une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname, 2),
@table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' + @table +
']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join [QUOIDONC?].sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?



Avatar
Fred BROUARD
Si vous nous expliquiez votre besoin dans le détail?

A +

Hervé REIGNOUX a écrit :
Merci pour votre acharnement à vouloir me répondre :)
Malheureusement, comme indiqué précédemment :
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?


Ma demande est peut-être inpossible à satisfaire ?
(J'ai re-cherché depuis, en vain :(


"Fred BROUARD" a écrit dans le message de news:

declare @bdd sysname, @SQL NVARCHAR(4000)
set @bdd = 'MonAutrebase'
SET @SQL = 'SELECT * FROM ' + @bdd + '.INFORMATION_SCHEMA.COLUMNS'
EXEC (@SQL)

A +

Hervé REIGNOUX a écrit :
Merci pour votre réponse.
Je m'attellerai à suivre votre conseil !
Pourriez-vous néanmoins m'aider - si possible - sur la question de savoir
comment invoquer ces « objets normatifs ».
Exemple :
declare @bdd sysname
set @bdd = 'MonAutrebase'
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Merci d'avance et bonne journée...


"Fred BROUARD" a écrit dans le message de
news:
SELECT *
FROM MonAutrebase. INFORMATION_SCHEMA.COLUMNS

évitez d'utiliser des vues systèmes quand il existe des objets normatifs
!

Pour savoir si la colonne est calculée COLUMNPROPERTY en combinant
OBJECTID.

A +

Hervé REIGNOUX a écrit :
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose
pour une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname, 2),
@table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' + @table
+ ']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join [QUOIDONC?].sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Avatar
Hervé REIGNOUX
Bonjour,
C'est bien ce me semblait : je n'ai pas dû être clair !
Il me faut écrire une FUNCTION qui serait implémentée dans une base et qui
retournerait la liste des colonnes d'une table, dans quelque base qu'elle
soit. (Mon besoin est plus vaste : en fonction d'un paramètre donné, elle
pourrait retourner son résultat sous diverses formes, par exemple {avec/sans
colonnes calculées ; nom encadrés par des crochets ; séparés par des
virgules ; séparés par des points virgules...}.)
Je voudrais éviter d'avoir à la mettre dans toutes les bases, et c'est là
mon unique problème (hormis un recours coupable aux vues système ;-)
Parce que comme c'est une fonction, je ne peux avoir recours à du SQL
dynamique, et je ne vois pas quelle syntaxe adopter pour mon maintenant
fameux
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Peut-être dois-je avoir obligatoirement recours à une procédure stockée,
mais c'est plus lourd à utiliser.
Merci encore pour votre aide !


"Fred BROUARD" a écrit dans le message de news:
%237r$
Si vous nous expliquiez votre besoin dans le détail?

A +

Hervé REIGNOUX a écrit :
Merci pour votre acharnement à vouloir me répondre :)
Malheureusement, comme indiqué précédemment :
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?


Ma demande est peut-être inpossible à satisfaire ?
(J'ai re-cherché depuis, en vain :(


"Fred BROUARD" a écrit dans le message de
news:
declare @bdd sysname, @SQL NVARCHAR(4000)
set @bdd = 'MonAutrebase'
SET @SQL = 'SELECT * FROM ' + @bdd + '.INFORMATION_SCHEMA.COLUMNS'
EXEC (@SQL)

A +

Hervé REIGNOUX a écrit :
Merci pour votre réponse.
Je m'attellerai à suivre votre conseil !
Pourriez-vous néanmoins m'aider - si possible - sur la question de
savoir comment invoquer ces « objets normatifs ».
Exemple :
declare @bdd sysname
set @bdd = 'MonAutrebase'
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Merci d'avance et bonne journée...


"Fred BROUARD" a écrit dans le message de
news:
SELECT *
FROM MonAutrebase. INFORMATION_SCHEMA.COLUMNS

évitez d'utiliser des vues systèmes quand il existe des objets
normatifs !

Pour savoir si la colonne est calculée COLUMNPROPERTY en combinant
OBJECTID.

A +

Hervé REIGNOUX a écrit :
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre
bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose
pour une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname,
2), @table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' +
@table + ']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join
[QUOIDONC?].sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage
SQL
Le site sur le langage SQL et les SGBDR :
http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning,
optimisation
*********************** http://www.sqlspot.com
*************************






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************


Avatar
bruno reiter
oups, dans une fonction, non

BR

"bruno reiter" wrote in message
news:
peut etre du SQL dynamique peut aider :

declare @db sysname
set @db = 'adventureworks'
exec ('select * from ' + @db +'.sys.tables')

BR

"Hervé REIGNOUX" wrote in message
news:49424b66$0$6823$
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose pour
une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname, 2),
@table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' + @table +
']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join [QUOIDONC?].sys.columns
sys_col on sys_tab.object_id = sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?






Avatar
Fred BROUARD
re bonjour

Hervé REIGNOUX a écrit :
Bonjour,
C'est bien ce me semblait : je n'ai pas dû être clair !
Il me faut écrire une FUNCTION qui serait implémentée dans une base et qui
retournerait la liste des colonnes d'une table, dans quelque base qu'elle
soit. (Mon besoin est plus vaste : en fonction d'un paramètre donné, elle
pourrait retourner son résultat sous diverses formes, par exemple {avec/sans
colonnes calculées ; nom encadrés par des crochets ; séparés par des
virgules ; séparés par des points virgules...}.)
Je voudrais éviter d'avoir à la mettre dans toutes les bases, et c'est là
mon unique problème (hormis un recours coupable aux vues système ;-)
Parce que comme c'est une fonction, je ne peux avoir recours à du SQL
dynamique, et je ne vois pas quelle syntaxe adopter pour mon maintenant
fameux
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Peut-être dois-je avoir obligatoirement recours à une procédure stockée,
mais c'est plus lourd à utiliser.



pas plus lourd !!!!

Il suffit de faire un
EXEC maproc
Ou dans un langage hôte encapsuler votre appel de proc stock dans un
compostant TStoredProc.

A +



Merci encore pour votre aide !


"Fred BROUARD" a écrit dans le message de news:
%237r$
Si vous nous expliquiez votre besoin dans le détail?

A +

Hervé REIGNOUX a écrit :
Merci pour votre acharnement à vouloir me répondre :)
Malheureusement, comme indiqué précédemment :
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?


Ma demande est peut-être inpossible à satisfaire ?
(J'ai re-cherché depuis, en vain :(


"Fred BROUARD" a écrit dans le message de
news:
declare @bdd sysname, @SQL NVARCHAR(4000)
set @bdd = 'MonAutrebase'
SET @SQL = 'SELECT * FROM ' + @bdd + '.INFORMATION_SCHEMA.COLUMNS'
EXEC (@SQL)

A +

Hervé REIGNOUX a écrit :
Merci pour votre réponse.
Je m'attellerai à suivre votre conseil !
Pourriez-vous néanmoins m'aider - si possible - sur la question de
savoir comment invoquer ces « objets normatifs ».
Exemple :
declare @bdd sysname
set @bdd = 'MonAutrebase'
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Merci d'avance et bonne journée...


"Fred BROUARD" a écrit dans le message de
news:
SELECT *
FROM MonAutrebase. INFORMATION_SCHEMA.COLUMNS

évitez d'utiliser des vues systèmes quand il existe des objets
normatifs !

Pour savoir si la colonne est calculée COLUMNPROPERTY en combinant
OBJECTID.

A +

Hervé REIGNOUX a écrit :
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre
bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose
pour une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname,
2), @table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' +
@table + ']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join
[QUOIDONC?].sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage
SQL
Le site sur le langage SQL et les SGBDR :
http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning,
optimisation
*********************** http://www.sqlspot.com
*************************




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Avatar
Hervé REIGNOUX
Merci,
Mais je persiste à penser que c'est plus lourd !
L'utilité de cette fonction est bien évidemment de construire du SQL
dynamique.
Exemple
declare @SQL varchar(max)
set @SQL = ...
set @SQL = @SQL + dbo.Liste_Champs(MaTable, 'IGNORE_COMPUTED')
set @SQL = ...
Utiliser une procédure stockée m'oblige à écrire quelque-chose du genre
set @SQL = ...
create table #List_Col (resultat varchar(max))
insert #List_Col (resultat) exec PS_Liste_Champs(MaTable,
'IGNORE_COMPUTED')
select @SQL = @SQL + resultat + #List_Col
drop table #List_Col
set @SQL = ...

Ma fonction fonctionne très bien depuis fort longtemps.
Le seul hic est que quand je dois y apporter des modifications, il me faut
les répercuter toutes les bases où elle est implémentée.

A moins de pouvoir référencer les vues système comme je le demande !

Ce qui doit être impossible, dois-je me résoudre à constater :(

Un grand merci quand même pour votre aide :)



"Fred BROUARD" a écrit dans le message de news:

re bonjour

Hervé REIGNOUX a écrit :
Bonjour,
C'est bien ce me semblait : je n'ai pas dû être clair !
Il me faut écrire une FUNCTION qui serait implémentée dans une base et
qui retournerait la liste des colonnes d'une table, dans quelque base
qu'elle soit. (Mon besoin est plus vaste : en fonction d'un paramètre
donné, elle pourrait retourner son résultat sous diverses formes, par
exemple {avec/sans colonnes calculées ; nom encadrés par des crochets ;
séparés par des virgules ; séparés par des points virgules...}.)
Je voudrais éviter d'avoir à la mettre dans toutes les bases, et c'est là
mon unique problème (hormis un recours coupable aux vues système ;-)
Parce que comme c'est une fonction, je ne peux avoir recours à du SQL
dynamique, et je ne vois pas quelle syntaxe adopter pour mon maintenant
fameux
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Peut-être dois-je avoir obligatoirement recours à une procédure stockée,
mais c'est plus lourd à utiliser.



pas plus lourd !!!!

Il suffit de faire un
EXEC maproc
Ou dans un langage hôte encapsuler votre appel de proc stock dans un
compostant TStoredProc.

A +



Merci encore pour votre aide !


"Fred BROUARD" a écrit dans le message de
news: %237r$
Si vous nous expliquiez votre besoin dans le détail?

A +

Hervé REIGNOUX a écrit :
Merci pour votre acharnement à vouloir me répondre :)
Malheureusement, comme indiqué précédemment :
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL dynamique.
Que mettre à la place de [QUOIDONC?] ?


Ma demande est peut-être inpossible à satisfaire ?
(J'ai re-cherché depuis, en vain :(


"Fred BROUARD" a écrit dans le message de
news:
declare @bdd sysname, @SQL NVARCHAR(4000)
set @bdd = 'MonAutrebase'
SET @SQL = 'SELECT * FROM ' + @bdd + '.INFORMATION_SCHEMA.COLUMNS'
EXEC (@SQL)

A +

Hervé REIGNOUX a écrit :
Merci pour votre réponse.
Je m'attellerai à suivre votre conseil !
Pourriez-vous néanmoins m'aider - si possible - sur la question de
savoir comment invoquer ces « objets normatifs ».
Exemple :
declare @bdd sysname
set @bdd = 'MonAutrebase'
SELECT *
FROM [QUOIDONC?].INFORMATION_SCHEMA.COLUMNS
Merci d'avance et bonne journée...


"Fred BROUARD" a écrit dans le message de
news:
SELECT *
FROM MonAutrebase. INFORMATION_SCHEMA.COLUMNS

évitez d'utiliser des vues systèmes quand il existe des objets
normatifs !

Pour savoir si la colonne est calculée COLUMNPROPERTY en combinant
OBJECTID.

A +

Hervé REIGNOUX a écrit :
Bonjour à tous !
J'explique cet objet sibyllin : je voudrais écrire une fonction qui
donnerait, mettons, la liste des colonnes d'une table d'une autre
bdd.
En mode bête :
_________________________________
Use master
Go
select
sys_col.name as column_name,
sys_col.is_computed
from AdventureWorks.sys.tables sys_tab inner join
AdventureWorks.sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id =
OBJECT_ID('AdventureWorks.HumanResources.Employee')
_________________________________

Maintenant, je voudrais écrire une fonction qui fasse la même chose
pour une table quelconque.
Embryon de code :
_________________________________
use master
Go
declare @objname nvarchar(776)
declare @bdd sysname
declare @schema sysname
declare @table sysname
declare @table_id int
set @objname = 'AdventureWorks.HumanResources.Employee'
--------------
select @bdd = parsename(@objname, 3), @schema = parsename(@objname,
2), @table = parsename(@objname, 1)
set @table_id = OBJECT_ID('[' + @bdd + '].[' + @schema + '].[' +
@table + ']', N'U')
select
sys_col.name as column_name,
sys_col.is_computed
from [QUOIDONC?].sys.tables sys_tab inner join
[QUOIDONC?].sys.columns sys_col on sys_tab.object_id =
sys_col.object_id
where sys_tab.object_id = @table_id
_________________________________
Comme je veux en faire une fonction, je ne peux pas créer une table
temporaire dans laquelle j'insérerais le résultat d'un SQL
dynamique.
Que mettre à la place de [QUOIDONC?] ?
Ça doit être du SQL primaire, mais je ne sais pas quoi faire :(
Quelqu'un peut-il m'aider ?


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage
SQL
Le site sur le langage SQL et les SGBDR :
http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning,
optimisation
*********************** http://www.sqlspot.com
*************************




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage
SQL
Le site sur le langage SQL et les SGBDR :
http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning,
optimisation
*********************** http://www.sqlspot.com
*************************






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************