В T-SQL Как отображать столбцы для указанного имени таблицы?
-
25-09-2019 - |
Вопрос
Я пытаюсь перечислить все столбцы из тех, кто выбирает таблицу AdventureWorks. Какой оператор T-SQL или сохраненные Proc могут быть выполнены, чтобы увидеть этот список всех столбцов? Я хочу использовать мое веб-приложение C #, чтобы ввести один параметр ввода = Table_Name, а затем получить список всех столбцов в качестве вывода. Прямо сейчас я пытаюсь выполнить SP_COCLUMNS, сохраненные ProC, которые работает, но я не могу получить только один столбец с выбором и 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'
Используйте Remus Rusanu ответ или использовать SqlConnection.GetSchema()
Функция из вашего C # код
Ответ на ваш Отредактировано вопрос:
Ваш сценарий не работает, потому что вы создаете динамическую строку, и в пределах этой динамической строки вы должны добавить цитаты в строку, которую вы размещаете в разделе «Где». Пересмотренный код будет:
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 = (все, что они не прошли), либо нет.