2012-02-10 4 views
1

기본적으로 동일한 작업을 수행하는 많은 수의 저장 프로 시저가 있습니다. 값 목록을 매개 변수로 가져온 다음 일부 테이블과 SELECT로 이동합니다. 이 값이 일치하는 모든 행T-SQL - 알 수없는 유형의 매개 변수를 알 수없는 숫자로 처리하는 저장 프로 시저

나는이 모든 경우를 처리 할 수있는 단일 저장 프로 시저를 갖고 싶습니다.

어떻게 해결할 수 있습니까?

+7

도 이것에 대한 저장 프로 시저를 사용하는 점은 무엇입니까 ?계획 캐싱이나 소유권 체인의 이점을 누리지 않으려면 동적 SQL이 필요합니다. 각각의 경우에 대해 별도의 저장 프로 시저 만 있으면됩니다. –

+0

예제를 보여주십시오. –

+0

다양한 형식의 매개 변수가있는 단일 sproc을 현재 사용할 수 있다고 생각하지 마십시오. http://stackoverflow.com/questions/7653405/expression-parameter-data-types-for-user-defined-functions - 아마도 codegen T4 등을 통해 – AakashM

답변

2

사용하여 호출 할 수 있습니다. XML을 입력 매개 변수로 보냅니다. xml을 테이블로 변환하십시오. 테이블 양식 동적 쿼리에서 원하는 기능을 달성하기 위해 그것을 실행합니다. 아래 예제를 참조하십시오. 이 예에서 Departments는 pkDepartmentId (int), DepartmentName (varchar) 및 BuildingNumber (int)의 3 열을 포함하는 테이블입니다. 이 방법을 사용하면 n 개의 매개 변수와 그 값을 입력 매개 변수로 보낼 수 있습니다.

pkDepartmentId에 DepartmentName BuildingNumber 1 전자 통신 1 2 컴퓨터 과학 2 3 계측 결과 다음이 시저를 실행하기에 기술 4

--EXEC TestProc '<Parameters> 
--     <Param> 
--      <ColumnName>pkDepartmentId</ColumnName> 
--      <ColumnValue>1</ColumnValue>   
--     </Param> 
--     <Param> 
--      <ColumnName>DepartmentName</ColumnName> 
--      <ColumnValue>Electronics and Communication</ColumnValue>   
--     </Param> 
--     <Param> 
--      <ColumnName>BuildingNumber</ColumnName> 
--      <ColumnValue>1</ColumnValue>   
--     </Param>  
--    </Parameters>' 

CREATE PROCEDURE TestProc 
@parameters XML 
AS 
BEGIN 
    DECLARE @temp1 TABLE 
    (
      ColName VARCHAR(100) 
     , ColVal VARCHAR(4000)  
    ) 

    INSERT INTO @temp1 
    SELECT Params.Col.value('ColumnName[1]', 'VARCHAR(50)') ColName 
      , Params.Col.value('ColumnValue[1]', 'VARCHAR(50)') ColVal    FROM @parameters.nodes('//Parameters/Param') Params(Col) 

    DECLARE @sql VARCHAR(4000) 

    SET @sql = 'SELECT * FROM Departments WHERE ' 

    SELECT @sql = @sql + ColName + ' = ''' + ColVal + ''' AND ' 
    FROM @temp1 

    -- Trim last AND 
    SET @sql = SUBSTRING(@sql, 1, LEN(@sql) - 3) 

    PRINT @sql     

    EXEC (@sql)    

END 

는 pkDepartmentId에 DepartmentName BuildingNumber 1 개 전자 통신 1

얻어진다
+0

XML과'DECLARE @ temp1 TABLE' 테이블에'ColumnType'이 표시되지 않습니까? 또한'@ sql' 문자열을 SQL 인젝션에 취약하게 만드는 방법으로 XML에서 검색 한 변수를'DECLARE'하고 싶다면'@sql'에서 사용할 수 있습니다. 문자열, 그래서'@ sql = 'SELECT * FROM Departments where id = @id AND firstName = @ firstName''과 같은 것을 만들 수 있습니까? – rapt

+0

안녕하세요, 난 ColumnType을 제거하는 코드를 수정했습니다. 변수를 선언하고 SQL 문자열을 작성하기 위해 변수를 사용하려면 cursor 또는 while 루프를 사용하여 @temp 테이블의 모든 레코드를 반복해야합니다. –

+0

감사합니다. 매우 도움이되었습니다. – rapt

0

기본 매개 변수 :

create procedure MyPRoc1 
(
@param1 int, 
@param2 int =1 
) 
as 
begin 
    --code 
end 

당신은 당신이 당신의 문제에 대한 XML 기반의 접근 방식을 사용하려고 할 수 있습니다

exec MyPRoc1 10 

또는

exec MyPRoc1 1,1 
+0

내 경우가 아님 - 매개 변수 개수에 상한선이 있다고 가정하고 각 선택적 매개 변수에 특정 유형이 있다고 가정하기 때문에. – rapt

+0

잘 매개 변수의 수에 관하여 당신은 쉽게 새로운 매개 변수를 추가 할 수 있습니다. 가변적 인 매개 변수 유형에 관해서는 모든 varchar를 작성한 다음 필요한 절차대로 처리해야합니다. 나는 그럴만 한 선택이지만, SQL에 "variable"데이터 유형은 없다. – Diego

4

하지 마십시오. 모든 데이터베이스 성능을 떨어 뜨릴 것입니다. T-SQL과 코드 재사용은 섞이지 않습니다.

무엇을 수 있습니까?하지만 모든 이러한 저장 프로 시저를 자동으로 생성해야합니다. 이 작업을 수행하는 많은 도구가 있으며 손쉽게 롤업 할 수 있습니다. SQL 자체를 사용하여 테이블 정의를 XML로 추출한 다음 XSLT를 사용하여이를 T-SQL로 변환하고 proc을 생성합니다. 프로젝트 빌드 및 연속적인 통합 프로세스로 자동화 할 수 있습니다. 강력한 유형, 효율적인 T-SQL 코드, 민첩하고 건조한 유지 보수가 용이 한 프로세스로 한 번의 변경으로 100 개의 procs를 쉽게 다시 작성할 수 있습니다.

+0

당신은 어떤 종류의 재사용을 원하십니까? SQL 쿼리를 동적으로 생성 하시겠습니까? – rapt

1

테이블 값 매개 변수 TVP 사용 (SQL Server 버전이> = 2008 이상인 경우)은 어떻습니까? 이것은 "알 수없는 유형"부분을 해결하지 못합니다. 나는 ... 당신은 VARCHAR (최대) 또는 NVARCHAR (최대)를 사용하고 필요에 캐스팅해야 할 것 같아요

참조 : SQL 서버의 이전 버전 http://www.sommarskog.se/arrays-in-sql-2008.html

, 참조 :

관련 문제