기본적으로 동일한 작업을 수행하는 많은 수의 저장 프로 시저가 있습니다. 값 목록을 매개 변수로 가져온 다음 일부 테이블과 SELECT로 이동합니다. 이 값이 일치하는 모든 행T-SQL - 알 수없는 유형의 매개 변수를 알 수없는 숫자로 처리하는 저장 프로 시저
나는이 모든 경우를 처리 할 수있는 단일 저장 프로 시저를 갖고 싶습니다.
어떻게 해결할 수 있습니까?
기본적으로 동일한 작업을 수행하는 많은 수의 저장 프로 시저가 있습니다. 값 목록을 매개 변수로 가져온 다음 일부 테이블과 SELECT로 이동합니다. 이 값이 일치하는 모든 행T-SQL - 알 수없는 유형의 매개 변수를 알 수없는 숫자로 처리하는 저장 프로 시저
나는이 모든 경우를 처리 할 수있는 단일 저장 프로 시저를 갖고 싶습니다.
어떻게 해결할 수 있습니까?
사용하여 호출 할 수 있습니다. 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
얻어진다XML과'DECLARE @ temp1 TABLE' 테이블에'ColumnType'이 표시되지 않습니까? 또한'@ sql' 문자열을 SQL 인젝션에 취약하게 만드는 방법으로 XML에서 검색 한 변수를'DECLARE'하고 싶다면'@sql'에서 사용할 수 있습니다. 문자열, 그래서'@ sql = 'SELECT * FROM Departments where id = @id AND firstName = @ firstName''과 같은 것을 만들 수 있습니까? – rapt
안녕하세요, 난 ColumnType을 제거하는 코드를 수정했습니다. 변수를 선언하고 SQL 문자열을 작성하기 위해 변수를 사용하려면 cursor 또는 while 루프를 사용하여 @temp 테이블의 모든 레코드를 반복해야합니다. –
감사합니다. 매우 도움이되었습니다. – rapt
기본 매개 변수 :
create procedure MyPRoc1
(
@param1 int,
@param2 int =1
)
as
begin
--code
end
당신은 당신이 당신의 문제에 대한 XML 기반의 접근 방식을 사용하려고 할 수 있습니다
exec MyPRoc1 10
또는
exec MyPRoc1 1,1
하지 마십시오. 모든 데이터베이스 성능을 떨어 뜨릴 것입니다. T-SQL과 코드 재사용은 섞이지 않습니다.
무엇을 수 있습니까?하지만 모든 이러한 저장 프로 시저를 자동으로 생성해야합니다. 이 작업을 수행하는 많은 도구가 있으며 손쉽게 롤업 할 수 있습니다. SQL 자체를 사용하여 테이블 정의를 XML로 추출한 다음 XSLT를 사용하여이를 T-SQL로 변환하고 proc을 생성합니다. 프로젝트 빌드 및 연속적인 통합 프로세스로 자동화 할 수 있습니다. 강력한 유형, 효율적인 T-SQL 코드, 민첩하고 건조한 유지 보수가 용이 한 프로세스로 한 번의 변경으로 100 개의 procs를 쉽게 다시 작성할 수 있습니다.
당신은 어떤 종류의 재사용을 원하십니까? SQL 쿼리를 동적으로 생성 하시겠습니까? – rapt
테이블 값 매개 변수 TVP 사용 (SQL Server 버전이> = 2008 이상인 경우)은 어떻습니까? 이것은 "알 수없는 유형"부분을 해결하지 못합니다. 나는 ... 당신은 VARCHAR (최대) 또는 NVARCHAR (최대)를 사용하고 필요에 캐스팅해야 할 것 같아요
는참조 : SQL 서버의 이전 버전 http://www.sommarskog.se/arrays-in-sql-2008.html
, 참조 :
도 이것에 대한 저장 프로 시저를 사용하는 점은 무엇입니까 ?계획 캐싱이나 소유권 체인의 이점을 누리지 않으려면 동적 SQL이 필요합니다. 각각의 경우에 대해 별도의 저장 프로 시저 만 있으면됩니다. –
예제를 보여주십시오. –
다양한 형식의 매개 변수가있는 단일 sproc을 현재 사용할 수 있다고 생각하지 마십시오. http://stackoverflow.com/questions/7653405/expression-parameter-data-types-for-user-defined-functions - 아마도 codegen T4 등을 통해 – AakashM