2010-04-08 7 views
3

내가 선택한 Adventureworks 테이블의 모든 열을 나열하려고합니다. 이 모든 열의 목록을 보려면 어떤 T-sQL 문 또는 저장된 proc을 실행할 수 있습니까? 한 C# 웹 응용 프로그램을 사용하여 하나의 입력 매개 변수 = table_name을 입력 한 다음 출력으로 모든 column_names 목록을 가져오고 싶습니다. 지금은 sp_columns가 작동하는 proc 저장 프로 시저를 실행하려고하는데 select와 exec를 결합하여 하나의 열만 가져올 수 없습니다. 아무도 이것을하는 방법을 아는가?T-SQL에서는 주어진 테이블 이름에 대해 열을 어떻게 표시합니까?

모든 답장을 보내 주셔서 감사합니다.하지만 답변이 필요한 것은 아닙니다. 내 문제를 더 설명해 줄께. 아래 쿼리는 내가 필요한 것을 반환합니다. 하지만 내 문제는이 논리를 입력 매개 변수를 사용하는 SP에 통합하는 것입니다.

select col.name from sysobjects obj inner join syscolumns col 
    on obj.id = col.id 
    where obj.name = 'AddressType' 
    order by obj.name 

그리고 현재 나의 SP는 다음과 같습니다 : 그래서 여기에 성공적인 SQL 문입니다

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' 

어떻게 받아 들일 수 있습니까? 이것 좀 먹을 래?

+0

이것은 오류입니다. 내 대답을 참조하십시오. – egrunin

답변

5

문자열로 문장을 생성 할 필요가 없습니다. 사실 그것은 당신을 망치고 있습니다.이것을 시도하십시오 :

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 
+0

굉장! 정말 고마워! 이것은 답변입니다! – salvationishere

8
select * from sys.columns where object_id = object_id(@tablename); 
+0

답변을 주셔서 감사합니다.하지만 제 수정 된 질문을 볼 수 있습니까? – salvationishere

1

사용 레무스 Rusanu 응답 또는 C# 코드에서 SqlConnection.GetSchema() 기능을 사용할 수는

2
SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TableName' AND TABLE_CATALOG = 'DatabaseName' 
3

표시 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의 편집에 따라

당신이 반환 값을 확인하고 어떤 테이블이 주어진 @tablename 매개 변수를 일치 발견 한 후 1을 얻는 경우에

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 @[email protected]@ROWCOUNT 
    IF @Rows=0 
    BEGIN 
     SET @ReturnValue= 1 --table not found!! 
    END 
    RETURN @ReturnValue 

END 

: 그냥 사용, 주어진 매개 변수를 동적 SQL이 필요합니다. 이것을 사용하여 응용 프로그램에 오류 메시지를 표시 할 수 있습니다.

1

에 대한 회신하여 편집 질문 :

동적 문자열을 구축하고 있기 때문에 스크립트가 작동하지 않습니다, 그리고 역동적 인 캐릭터 라인 내에서 당신이 당신의 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의 오버 헤드를 필요로 같은 일을하지 것이다 : 당신은 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 

을, 문제는 여기되지 않습니다 - 중 obj.name = (그들이 전달 무엇이든), 또는 그렇지 않습니다.

관련 문제