在T-SQL如何为给定的表名显示列?
-
25-09-2019 - |
题
我想列出所有从哪个了Adventureworks表我选择列。什么T-SQL语句或存储过程中我能够执行来查看所有列的这个名单?我想用我的C#web应用程序输入一个输入参数= table_name的,然后让所有的COLUMN_NAMES作为输出的一个列表。现在,我尝试执行存储过程其运作SP_COLUMNS,但我不能只是选择和exec结合的一列。没有任何人知道如何做到这一点?
谢谢大家对所有您的答复,但没有你的答案做什么,我需要。让我解释一下我的问题更适合你。下面回报什么,我需要查询。但我的问题是将这一逻辑放进一个接受输入参数的SP。因此,这里是成功的SQL语句:
select col.name from sysobjects obj inner join syscolumns col
on obj.id = col.id
where obj.name = 'AddressType'
order by obj.name
和目前我的SP如下:
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
但是我运行如上
exec getColumnNames 'AddressType'
和它给我错误:
Invalid column name 'AddressType'
我如何做到这一点?
解决方案
您不需要创建语句作为字符串 - 事实上,那正是你搞乱了。尝试这样:
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
其他提示
select * from sys.columns where object_id = object_id(@tablename);
要为database.dbo.yourtable
显示信息尝试这样:
SELECT
*
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_CATALOG ='database'
AND TABLE_SCHEMA='dbo'
AND TABLE_NAME ='yourtable'
ORDER BY ORDINAL_POSITION
修改强>基于OP的编辑
您不需要动态SQL,只需使用给定的参数:
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
如果您检查返回值,并获得了1则没有桌子上找到指定@tablename参数匹配。可以使用此应用程序中,得到的错误消息。
SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TableName' AND TABLE_CATALOG = 'DatabaseName'
从C#代码使用莱姆斯Rusanu答案或使用SqlConnection.GetSchema()
功能
一个答复您的编辑强>问题:
因为你建立一个动态的字符串,而该动态字符串中您必须在WHERE子句中添加引号字符串你把你的脚本不起作用。修改后的代码将是:
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
但是,你为什么栋动态字符串?这将做同样的事情,而不是需要动态SQL的开销:
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
如果你担心SQL注入,是不是这里有一个问题 - 无论是obj.name =(无论他们通过),要么没有
不隶属于 StackOverflow