Dans T-SQL comment afficher les colonnes pour le nom de table donné?
-
25-09-2019 - |
Question
Je suis en train d'énumérer toutes les colonnes de la table selon Adventureworks je choisis. Quel énoncé T-sql ou proc stocké puis-je exécuter pour voir la liste de toutes les colonnes? Je veux utiliser mon C # application Web à l'entrée un paramètre d'entrée = table_name puis obtenir une liste de tous les column_names en sortie. En ce moment je suis en train d'exécuter les sp_columns stockées proc qui fonctionne, mais je ne peux pas juste une colonne avec sélection et exec combiné. Quelqu'un sait-il comment faire?
Merci à tous pour vos réponses, mais aucune de vos réponses font ce que j'ai besoin. Permettez-moi d'expliquer mon problème plus pour vous. La requête renvoie ci-dessous ce que je dois. Mais mon problème intègre cette logique dans un SP qui prend un paramètre d'entrée. Voici donc le succès instruction SQL:
select col.name from sysobjects obj inner join syscolumns col
on obj.id = col.id
where obj.name = 'AddressType'
order by obj.name
Et actuellement mon SP ressemble à:
CREATE PROCEDURE [dbo].[getColumnNames]
@TableName VarChar(50)
AS
BEGIN
SET NOCOUNT ON;
SET @TableName = RTRIM(@TableName)
DECLARE @cmd AS NVARCHAR(max)
SET @cmd = N'SELECT col.name from sysobjects obj ' +
'inner join syscolumns col on obj.id = col.id ' +
'where obj.name = ' + @TableName
EXEC sp_executesql @cmd
END
Mais je lance ci-dessus comme
exec getColumnNames 'AddressType'
et il me donne l'erreur:
Invalid column name 'AddressType'
Comment y parvenir?
La solution
Vous n'avez pas besoin de créer la déclaration en tant que chaîne - en fait, c'est ce qui vous chambouler. Essayez ceci:
CREATE PROCEDURE [dbo].[getColumnNames] @TableName VarChar(50) AS
BEGIN
SET NOCOUNT ON;
SELECT col.name FROM sysobjects obj
INNER JOIN syscolumns col ON obj.id = col.id
WHERE obj.name = @TableName
END
Autres conseils
select * from sys.columns where object_id = object_id(@tablename);
pour afficher les informations pour database.dbo.yourtable
essayez ceci:
SELECT
*
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_CATALOG ='database'
AND TABLE_SCHEMA='dbo'
AND TABLE_NAME ='yourtable'
ORDER BY ORDINAL_POSITION
EDIT basé sur la modification de l'OP
Vous n'avez pas besoin sql dynamique, il suffit d'utiliser le paramètre donné:
CREATE PROCEDURE [dbo].[getColumnNames]
@TableName VarChar(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Rows int
,@ReturnValue int
SET @ReturnValue=0
SELECT
col.name
FROM sysobjects obj
inner join syscolumns col on obj.id = col.id
WHERE obj.name = @TableName
ORDER BY obj.name
SELECT @Rows=@@ROWCOUNT
IF @Rows=0
BEGIN
SET @ReturnValue= 1 --table not found!!
END
RETURN @ReturnValue
END
si vous vérifiez la valeur de retour et obtenir un 1 aucune table n'a été trouvée correspond au paramètre @TableName donné. Vous pouvez l'utiliser pour donner un message d'erreur dans l'application.
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TableName' AND TABLE_CATALOG = 'DatabaseName'
Utilisez Remus Rusanu réponse ou utiliser la fonction SqlConnection.GetSchema()
de votre code c #
Une réponse à modifié Question:
Votre script ne fonctionne pas parce que vous construisez une chaîne dynamique, et dans cette chaîne dynamique, vous devez ajouter des guillemets à la chaîne que vous placez dans votre clause where. Le code révisé serait:
BEGIN
SET NOCOUNT ON;
SET @TableName = RTRIM(@TableName)
DECLARE @cmd AS NVARCHAR(max)
SET @cmd = N'SELECT col.name from sysobjects obj ' +
'inner join syscolumns col on obj.id = col.id ' +
'where obj.name = ''' + @TableName + ''''
EXEC sp_executesql @cmd
END
Cependant, pourquoi êtes-vous Buliding une chaîne dynamique? Cela ferait la même chose et ne nécessite pas la surcharge de SQL dynamique:
BEGIN
SET NOCOUNT ON;
SET @TableName = RTRIM(@TableName)
SELECT col.name from sysobjects obj
inner join syscolumns col on obj.id = col.id
where obj.name = @TableName
END
Si vous êtes inquiet au sujet de l'injection SQL, n'est pas un problème - soit obj.name = (tout ce qu'ils passaient dans), ou ne pas
.