2010-07-27 4 views
2

나는 일반적인 방식으로 사용하고 싶지만 상당히 복잡한 저장 프로 시저와 함수가 있습니다.저장 프로 시저, 매개 변수로 테이블 이름 전달

이상적으로 나는 현재 하드 코딩되어 있으므로 테이블 이름을 프로 시저의 매개 변수로 전달할 수 있기를 바랍니다.

나는 동적 프로 시저를 사용하여 동적 테이블 이름을 매개 변수에서 연결하기 위해 기존 프로 시저 내에서 기존 SQL을 모두 변환해야한다고 제안했지만, 다른 식으로 테이블에? 예를 들어

:

SELECT * FROM @MyTable WHERE... 

그렇다면, 나는 테이블 이름에서 @MyTable 변수를 설정하는 방법?

SQL Server 2005를 사용하고 있습니다.

+0

? 다른 검색어의 결과입니까? – Brett

+1

marc_s가 말했듯이 SQL 2008로 업그레이드하십시오. 단일 테이블에 대한 많은 수의 업데이트를 처리 할 때 테이블 값 매개 변수는 순수한 awesomeness입니다. – NotMe

+0

그의 질문을 자세히 읽으십시오. 질문 제목에도 불구하고 테이블 이름 (테이블이 아님)을 전달하려고합니다. –

답변

3

동적 SQL이이를 수행하는 유일한 방법이지만, 필요한 경우 응용 프로그램의 아키텍처를 다시 생각해 볼 수 있습니다. SQL은 "일반화 된"코드에는별로 좋지 않습니다. 개별 작업을 수행하도록 설계되고 코딩 된 경우 가장 효과적입니다.

TableA에서 선택하는 것은 Select 문이 동일하게 보일지라도 TableB에서 선택하는 것과 같지 않습니다. 다른 인덱스, 다른 테이블 크기, 데이터 분포 등이있을 수 있습니다.

일반적인 방법 인 개별 저장 프로 시저를 생성 할 수 있습니다. 필요한 테이블에 대한 다양한 선택 저장 프로 시저를 만드는 코드 생성기가 필요합니다. 각 테이블에는 고유 한 SP가 있으며이 SP를 응용 프로그램에 연결할 수 있습니다.

나는이 종류의 생성기를 T-SQL로 작성했지만 대부분의 프로그래밍 언어로 쉽게 만들 수 있습니다. 그것은 꽤 기본적인 것들입니다.

Scott E가 ORM을 가져온 이래로 한 가지 더 추가하기 만하면 ... 가장 정교한 ORM으로 이러한 저장 프로 시저를 사용할 수도 있습니다.

+0

누구나 SQL 생성기 작성에 대한 자세한 정보를 제공 할 수 있습니까? 어떻게 배치하고, 생성 된 코드가 복제 된 모든 위치가 동기화 상태로 유지되는지 확인하십시오. –

+0

IMO 생성 된 코드를 모두 소스 제어 시스템에 체크인해야합니다. 그런 다음 특정 테이블과 관련된 항목을 수정할 수 있습니다. 실행하는 모든 배포는 소스 제어 시스템의 파일을 사용해야합니다. Red Gate의 SQLCompare (및 SQLDataCompare)와 같은 도구를 사용하여 다양한 DB가 동기화되어 있는지 확인할 수 있습니다. 그들은 www.red-gate.com에 있습니다. 또한 새로운 SQL 소스 제어 제품과 배포 패키지 도구가 있습니다. –

1

동적 SQL을 사용해야합니다. 그러나 그렇게하지 마십시오! ORM을 사용하는 것이 좋습니다.

+2

ORM을 추가하면 매우 높은 수준의 오버 헤드가 추가됩니다. 네가 네일을 넣기 위해 망치를 사용하지 않는 동안 네가 사용할 수있는 정말 큰 돌맹이가있다. – Fosco

+0

나는 다이나믹 SQL의 보안 위험에 대해 생각하고있다. 그리고 대부분의 간단한 쿼리에서 linq-to-sql과 같은 것은 오버 헤드가 거의 없습니다. 또한 '매우 높은 수준의 오버 헤드'는 꽤 주관적이라고 생각하지 않습니까? '동적 SQL을 사용하지 마십시오'라고 말하는 것 같습니다. – ScottE

1
EXEC(N'SELECT * from ' + @MyTable + N' WHERE ...  ') 
+0

동적 SQL은 일반적으로 '최적'은 아니지만 사용하지 말라는 말을 듣지 않습니다. 그것은 그것의 장소가 있습니다. – Fosco

1

동적 Sql을 사용할 수 있지만 해당 매개 변수의 출처를 100 % 신뢰할 수 없다면 먼저 개체가 존재하는지 확인하십시오. SQL 서버가 다른 매개 변수에 대해 동일한 실행 계획을 재사용 할 수 없으므로 성능에 문제가있을 수 있습니다. 이 테이블이 생성되거나 저장되는 방법/

IF OBJECT_ID(@tablename, N'U') IS NOT NULL 
BEGIN 
    --dynamic sql 
END 
0
ALTER procedure [dbo].[test](@table_name varchar(max)) 
AS 
BEGIN 
    declare @tablename varchar(max)[email protected]_name; 
    declare @statement varchar(max); 
    set @statement = 'Select * from ' + @tablename; 
    execute (@statement); 
END 
관련 문제