В T-SQL Как отображать столбцы для указанного имени таблицы?

StackOverflow https://stackoverflow.com/questions/2603197

Вопрос

Я пытаюсь перечислить все столбцы из тех, кто выбирает таблицу 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 = (все, что они не прошли), либо нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top