문제

이 길이에 대해 죄송합니다. 관련이없는 솔루션을 피하기 위해 많은 정보를 제공하려고합니다.

내 목표는 SELECT 문이 실행되기 전에 순간에 일부 계산 된 값을 업데이트 할 수 있도록 최소 1 개의 업데이트 명령문을 선택 문에 포함시키는 것입니다 (SELECT의 트리거처럼 생각하십시오). 내가 사용하는 시스템에 의해 제약이 제한되어 있기 때문에보기는 즉각적인 솔루션이 아닙니다 (아래 참조).

나는 피처에서 약한 제 3 자 Commerical ERP를 커스터마이즈하고 있습니다 (시스템은 이름이 없어 질 것입니다! - Upshot는 들어 보지 못했지만 집이 성장하지는 않습니다). 텍스트/GUI를 사용하여 선택 쿼리를 빌드 할 수있는 통조림 쿼리 기능이 있습니다. 쿼리를 저장하면 쿼리를 클릭하여 쿼리를 클릭하여 실행하고 결과를 볼 수 있습니다. ERP는 MS SQL Server 2000 위에 실행됩니다. 버전 업그레이드는 지금 카드에 없습니다. ERP 외부에서 필요한 기능 세트를 내가 원하는 언어로 쓸 수 있습니다. 기능이 보증된다면 과거에 이것을 해냈습니다. 그러나 내 사용자 커뮤니티는 ERP 시스템에서 사용자 정의를 수행 할 수있을 때 더 쉽다는 것을 알게됩니다.

쿼리는 임의로 복잡 할 수 있지만 ERP 패키지는 SQL Select 문 자체를 빌드합니다. 컴파일 된 ERP의 내부는 이와 같은 것입니다 (이것은 단지 추측입니다!) :

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond

GUI BUILDER는 초보자 사용자가 Fieldlist 등을 구축 할 수 있도록 도와 주지만 위와 같이 결합 될 때 SQL이 유효 한 한 우회하고 조항을 텍스트로 쓸 수 있습니다.

Select 조항에 관계없이 Select 조항의 부작용으로 저장된 절차를 실행할 수있는 약화를 찾을 수없는 것 같습니다. Select Clause, Where Clause 등에 관계없이 시스템을 탈옥하는 방법은 상관하지 않습니다. SQL 주입 공격은 기본 SQL Server 자체의 보안을 수정해야한다는 것을 의미하지 않는 한 괜찮을 것입니다. UDF를 보았지만 스칼라 UDF에 업데이트 명령문을 넣을 수 없으며 테이블 UDF의 반환을 수정하는 것은 의미가 없습니다 (또는이를 수행합니까?). 보기 내에서 업데이트 할 수 있다면 예제를보고 싶지만 뷰를 사용하여 열을 계산할 수 있으며 이것이 제가 찾고있는 솔루션이 아닙니다. 나는 이것을 달성하기 위해 일종의 XP_를 사용할 수 있다는 것에 대한 암시 적 진술을 읽었지만 어떤 XP_ 또는 어떻게 해야하는지, 나는 모른다.

이 질문은 그 자체로 해결책이 아닙니다. SELECT 문의 테이블 업데이트

도움이 되었습니까?

해결책

SELECT를 SQL 2000의 업데이트와 결합하는 방법을 생각할 수 없습니다 (2005 년 이상 출력 절을 사용할 수 있습니다). 그러나 "Select", "From"및 "Where"와 함께 연결되는 3 개의 문자열 값 (FieldList, TableStandjoins, Wherecond)을 얻는 것처럼 보이며 심각한 SQL 손상과 같은 코드 감지를하지 않는다고 가정합니다. 당신은 다음과 같은 것을 함께 할 수 있습니다.

fileList = "NULL where 1 = 0; UPDATE MyTable set MyColumn = 'Whatever' where SomeColumn = 'Criteria'; SELECT MyColumn"

tableListAndJoins = "MyTable"

whereCond = "SomeColumn = 'Criteria'"

세미콜론은 실제로 선택 사항이며 SQL 2000에서도 작동하지 않을 수도 있습니다. 하나의 명령이 끝나고 다음 시작이 시작되는지 명확하게 만듭니다.

이것의 단점은 두 개의 데이터 세트를 되 찾는 것입니다. 첫 번째는 빈 1 열 세트 (열에 이름을 원할 경우 널이라도)이며 원하는 데이터는 두 번째 세트에 있습니다. 이 세 가지 값이 어떻게 사용되는지와 오류가 잡히는 방법에 따라 다른 해결 방법이 가능할 수 있습니다. (첫 번째 쿼리를 생성하고 오류로 만들고 업데이트와 두 번째 쿼리가 진행되기를 바랍니다.)

다른 팁

저장된 절차에서 동적 SQL을 사용해보십시오 마지막 답변에 대해 언급했습니다

원래 저자가 자신이받을 자격이있는 크레딧을 얻을 수 있도록 연결되어 있으며, 희망적으로 도움이 될 것입니다.

업데이트 전에 선택을 원하기 때문에 게시 한 링크에서와 같이 동적 SQL을 수정하여 먼저 선택을 수행 할 수 있습니다.

나는 당신의 상황의 제약을 이해하지 못하지만 다음과 같은 두 가지 진술 만 실행할 수는 없습니다.

string sql = "update MyTable set x=y;select x from MyTable;";

저장된 기능이 옵션일까요? "call procedure_name (x)"대신 "select _name (x)"을 사용할 수 있습니다.

XP에 대한 내 추측은 업데이트를 수행하여 쿼리에 포함시키기 위해 자신의 XP를 작성한다는 것입니다. 그것이 작동하는지 여부와 쿼리에서 어디에 있는지 SQL을보기 전에 실행되도록해야합니다.

내가 시도 할 모든 것을 시도한 것 같습니다. 아마도 주를 업데이트하기가 쉽기 때문에 당신을 느낍니다. ~ 후에 당신은 선택을 운영했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top