2013-04-01 4 views
1

나는이 열이있는 테이블 userdata이 전체 테이블 또는 개별 열을 업데이트합니다.한 저장 프로 시저가 너무

이제이 테이블을 저장 프로 시저로 업데이트하려고합니다. 저장 프로 시저로이 테이블을 업데이트 할 수 있지만 내 요구 사항은 profile.aspx입니다. 사용자가 저장 프로 시저로 모든 열을 업데이트 할 수 있습니다. 그러나 다른 양식에서는 사용자가 단지 setting.aspx 페이지에서 몇 개의 열만 업데이트하도록하고 사용자는 userPass 열만 업데이트 할 수 있습니다.

그래서 다른 저장 프로 시저를 만들어야합니다. 그리고 나는 이처럼 많은 테이블을 가지고있다. 그리고 나는 다른 컬럼으로 많은 테이블을 갱신하기 위해 얼마나 많은 스토어드 프로 시저를 생성해야하는지 궁금했습니다.

누구나 짧은 방법을 제안하여 테이블 당 하나의 저장 프로 시저만으로 전체 테이블 또는 개별 열을 업데이트하거나 C# 코드를 사용하여이를 단축 할 수 있습니까? 사전

+0

나는 *** 일부 *** 또는 모든 열을 업데이트 할 수있는 단일 저장 프로 시저를 만들 것을 권장하지 않습니다. col 한 번에 모든 절차가 완료됩니다. 그것은 거대하고, 지저분하고, 복잡하고, 이해하기 어렵고, 유지하기 힘든 절차 일 것입니다. 그럴 가치가 없어. 당신은 x 업데이트 시나리오를 위해 x 저장 프로 시저가 필요합니다 - 또는 프로 시저 수를 써야하는 것을 피하기 위해 Entity Framework와 같은 ORM을 사용합니다 .... –

답변

3

MSDN에서 ISNULL 함수를 사용할 수 있습니다.이 함수는 MSDN의 아래 명령문에서 설명합니다.

NULL을 지정된 대체 값으로 바꿉니다.

다양한 작업에서 업데이트 할 모든 필드를 업데이트하는 하나의 저장 프로 시저를 작성할 수 있습니다. 모든 페이지에서 동일한 절차를 호출하십시오. 그런 다음 한 페이지에서 나머지 매개 변수 (해당 페이지와 관련이없는)에 대해 해당 페이지의 관련 매개 변수 & 만 전달하면 null을 전달합니다.

귀하의 저장 프로 시저가이

UPDATE dbo.userTable SET 
userName = ISNull(@userName, userName), 
userEmail= ISNull(@userEmail, userEmail), 
-- list of all your table fields goes here 
WHERE userID = @userID 

같아야 이것이 할 것입니다 것은, 당신이 매개 변수를 전달하는 경우; 해당 필드의 값을 업데이트합니다. 필드에 대해 null을 전달하면 해당 필드가 기존 값으로 갱신됩니다. 따라서 해당 필드는 업데이트 작업에서 영향을받지 않습니다.

+0

감사합니다 devraj .. 내 하루를 저장했습니다 !! :) –

0

에서

덕분에 각 하나의 필드의 그 갱신을 제어하는 ​​여러 if.. else.. 조건 단일 저장된 프로 시저를 가질 수 있습니다. 그런 다음 매개 변수로 전달하여 업데이트 할 필드를 제어 할 수 있습니다.

0

나는 다음과 같이 할 수 있다고 생각한다 : 첫 페이지에서, 업데이트하지 않으려는 편집 가능 필드를 설정해야하며 값을 매개 변수로 저장 프로 시저에 전달해야한다. 저장 프로 시저에서이 필드의 이전 값을 해당 매개 변수에 저장하고, 같지 않으면 업데이트하고 그렇지 않으면이 필드를 사용하지 않습니다.

0

은이 같은 것을 사용할 수 있습니다

UPDATE tbl t 
    SET t.userName = CASE WHEN @userName IS NULL THEN t.userName ELSE @userName END 
    , t.userEmail = CASE WHEN @userEmail IS NULL THEN t.userEmail ELSE @userEmail END 
    , ... 
    WHERE t.userName = CASE WHEN @WHERE_userName IS NULL THEN t.userName ELSE @WHERE_userName END 
    AND ... 

당신이 그냥 매개 변수에 대한 프로 시저 호출에 코드에서 DBNull.Value을 통과 특정 필드를 업데이트하지 않도록합니다. NULL 값으로 필드를 업데이트 할 의도가없는 경우에만 작동합니다. 널 (null)이 필요한 경우, 널 (null)을 사용하도록 코드를 다시 작성할 수 있습니다. 추가 도움이 필요하면 의견을 말하십시오.

+0

감사합니다 bugartist ..이게 내가 기대했던 것 같다 .. 그냥 시도해 .. .. 돌아올 것입니다 .. 정말 고마워요. –

0

업데이트해야하는 Datatable의 모든 데이터를 가져옵니다. datatable.WriteXML 메서드를 사용하여 스트림 개체의 모든 문자열에서 XmlWriteMode.IgnoreSchema를 사용하여 데이터 만 가져옵니다.

 DataTable dt = new DataTable(); 
     dt.WriteXml(stream object ,XmlWriteMode.IgnoreSchema) 

지금 VARCHAR (최대) 매개 변수를 적용하고 절차에 스트림 개체를 전달 프로 시저를 만듭니다.

Openxml을 사용하거나 Sqlserver의 XML 변수에서이 모든 것을 얻을 수 있습니다. 모든 데이터를 @tablevariable 또는 #temp 테이블에서 가져옵니다.

Openxml in sqlserver 또는 For Xml for XMl variable

는 는

의 SQL qquery 그러면 .... 하나 개의 테이블에있는 모든 것은 기본 키 ID와 같은 에 데이터베이스 테이블 기지를 업데이트하는 테이블을 사용하여 얻을 것입니다

아래처럼

Update "Database Table Name" 
set ......... 
from "GetDatafromc#table"