2013-06-06 3 views
0

일반 업데이트 절차를 만들려고합니다. 이 절차의 요점은 테이블에서 일어나는 모든 것을 추적 할 수 있기를 원한다는 것입니다. 레코드가 업데이트 된 경우 레코드를 변경 한 사람, 원래 있던 레코드, 변경된 레코드 및 변경된 레코드를 알 수 있어야합니다. 책임 성이 필수적인 가장 중요한 테이블에서만이 작업을 수행합니다.SQL Server 2012 테이블 문제에 XML을 삽입하십시오.

바로 지금 우리는 웹 서버 프로그래밍과 SQL Server 명령을 조합하여이 작업을 수행합니다.

저는 현재 갖고있는 것을 취하여 SQL 전용 버전을 만들어야합니다.

원래 SP가 UpdateWithHistory라고 :

그래서, 여기에 내가 필요의 요구 사항입니다. 지금 당장은 4 개의 매개 변수가 모두 varchar를 사용합니다 (또는 nvarchar 일 수도 있고 중요하지 않을 수도 있음). 테이블 이름, 기본 키 필드, 기본 키 값 및 쉼표로 구분 된 필드 및 값 목록은 field = 'value', field1 = 'value1'... 등의 형식입니다.

백그라운드에서 문자열 테이블 이름을 실제 테이블에 매핑하는 데 사용하는 매핑 테이블이 있습니다.

저장 프로 시저에서 OPENROWSET, exec(), select into, xml 및 다른 방법의 다양한 조합을 시도했습니다. 아무도 작동하지 않는 것 같습니다.

기본적으로 4 개의 제공된 매개 변수에서 간단한 선택 문 (조인 또는 다른 복잡한 선택 항목 없음)을 동적으로 생성 할 수 있어야합니다. 그런 다음 해당 쿼리의 결과를 테이블에 저장해야합니다. 동적 인 관계로 쿼리되는 필드의 수 또는 데이터 형식이 무엇인지 알 수 없습니다.

나는 적절한 필드와 데이터 형식이있는 테이블을 자동으로 만들 것이므로 select into를 시도했지만 exec 명령과 함께 작동하지 않습니다. 나는 또한 시도했다

exec sp_executeSQL @SQL, N'@output xml output', @resultXML output 

여기서 @resultXML은 XML 데이터 유형이고 @SQL은 sql 명령이다. @resultXML은 내가하는 일과 관계없이 항상 null로 끝납니다. 나는 "XML 경로"가 항상 하나의 열을 반환한다는 것을 알고 있기 때문에 xml 경로를 시도했지만 .... 문에 삽입 할 때 사용할 수는 없습니다. ...

그 명령문 출력은 원본을 판별하는 데 사용됩니다 갱신 전의 값.

내가이 장애물을 지나면 나머지는 케이크 조각이 될 것입니다. 누구든지 아이디어가있어? 나는 글로벌 테이블을 사용하지 않는, 그래서 기꺼이 다른 대답을 받아 들일 있지만 명시된 그래서 여기

은, 기본적으로 ...,

DECLARE @curRecordString varchar(max) = 'SELECT * into ##TEMP_TABLE FROM SOMEDB.dbo.' + @tbl + ' WHERE ' + @prikey + ' = ''' + @prival + ''' ' 
exec(@curRecordString) 

드디어 일을 가지고 뭔가 코드 전에는 동적으로 SQL 쿼리를 작성한 다음 나중에 쿼리에 액세스 할 수 있도록 결과를 저장해야합니다. 나중에 XQuery를 사용하여 노드를 파싱하고 비교할 것이므로 XML 데이터 유형으로 저장하는 것을 선호합니다. 위의 코드에서 전역 프로 시저 테이블 (이상한 것은 아님)을 사용하여 나머지 프로 시저가 데이터에 액세스 할 수 있도록 쿼리 결과를 저장합니다.

내가 말했듯이, 나는이 접근법을 좋아하지 않지만 다른 누군가가 SQL 쿼리를 동적으로 빌드하고 실행하며 나중에 결과에 액세스 할 수 있도록 결과를 저장할 수있는 더 나은 것을 만들 수 있기를 바랍니다. 저장 프로 시저에서.

+2

왜 당신은 단순히 [마이크로 소프트 SQL 서버 변경 데이터 캡처] (http://msdn.microsoft.com/en-us를 사용하지 않는 ... 가장 확실히 해킹이지만, /library/bb522489%28v=sql.105%29.aspx)? – ErikE

+0

숫자 1, 그게 무엇인지 모릅니다. 2 번, 우리 회사에서 사용하는 시스템은 10 년이 넘었으며 원래 고전 ASP와 VBScript가 새로 만들어 졌을 때 원래 설계되었습니다. 그래서 우리가하는 것은이 오래된 시스템을 따라야합니다. –

+0

내 링크가 수년 전에 만든이 테이블에 모든 추적 기록을 유지하려고하기 때문에 나는 당신의 링크를 따라갔습니다.하지만 대부분의 경우에는 작동 하겠지만, 내 것이 아니 었습니다. –

답변

0

이것은

DECLARE @s VARCHAR(MAX) 
SET @s = 'SELECT (SELECT 1 as splat FOR XML PATH) a' 

CREATE TABLE #save (x XML) 

INSERT INTO #save 
     (x) 
EXEC (@s) 


SELECT * FROM #save s 

DROP TABLE #save 
+0

내부 Select 쿼리에 테이블을 지정하면 작동하지 않습니다. "메시지 116, 수준 16, 상태 1, 줄 2 EXISTS 함께 하위 쿼리가 도입 될 때 선택 목록에서 하나의 식만 지정할 수 있습니다." –

+0

흠, 방금 테이블을 가지고 시험해 보았는데, 저에게 효과적이었습니다. 시도한 버전을 게시 할 수 있습니까? SET @ s = 'SELECT (XML PATH에 대한 SELECT * FROM 테이블)' –

+0

내가 내가 한 일을 설명하는 동안 내가 잘못한 것을 알아 냈습니다. SELECT 1을 SELECT *로 바꾼 다음 splat과 FOR 사이에 테이블을 포함 시켰습니다. 나는 '스 플랫'을 제거하는 것을 잊었다. 내가 그것을 제거했을 때, 그것은 잘 동작했습니다. 또한 위에 쓴 것과 매우 비슷한 것을 시도했으며 작동하지 못했습니다. 그러나 웬일인지 이제는 작동하기 때문에 앞으로 더 나아질 것입니다. 감사. –