>>CREATE PROCEDURE bsp_PersonnelPut >> @personnelkey bigint = NULL OUTPUT, >> @personnelid varchar(10) = NULL, >> @lastname var = NULL, >> @firstname udt_firstname = NULL >> -- etc.etc.etc. >>AS >> IF (@personnelkey = 0 OR @personnelkey IS NULL) >> BEGIN >> -- Insert Values into the Personnel table >> INSERT Personnel >> (personnelid, >> lastname, >> firstname) >> SELECT @personnelid, >> @lastname, >> @firstname >> >> SELECT @personnelkey = SCOPE_IDENTITY() >> >> END >> ELSE >> BEGIN >> -- Update the Personnel table >> UPDATE Personnel >> SET personnelid = ISNULL(@personnelid, personnelid), >> lastname = ISNULL(@lastname, lastname), >> firstname = ISNULL(@firstname, firstname) >> WHERE personnelkey = @personnelkey >> END >> >> RETURN 0 >>>>
>>*-------------------------------------------------------------------------------* >>FUNCTION GetPutProc >>*-------------------------------------------------------------------------------* >>LPARAMETERS tnConnection, tcTable >> >>tcTable = PROPER(ALLTRIM(tcTable)) >>LOCAL lnResults, lcProc, lcName, lcType, lcField, lcKey >>lcProc = "" >>lnResults = SQLCOLUMNS(tnConnection, tcTable, "NATIVE", "cTemp") >>IF lnResults < 1 OR RECCOUNT("ctemp") < 1 >> RETURN "" >>ENDIF >> >>lcName = "bsp_" + tcTable + "Put" >>lcKey = LOWER(tcTable) + "key" >> >>*-- Write the header for the stored proc >>lcProc = GetProcHeader(lcName, tcTable, "Put") >> >>*-- Write the parameter list >>* First parm is primary key, used only as output variable in insert procs >>SELECT cTemp >>SCAN >> lcType = LOWER(ALLTRIM(type_name)) >> lcField = LOWER(ALLTRIM(column_name)) >> DO CASE >> CASE lcField == lcKey >> *-- Don't insert a key, but get the identity value >> lcProc = lcProc + CRLF + TAB + "@" + lcField + ; >> TAB + TAB + lcType + " = NULL OUTPUT," >> CASE lcType == "char" OR lcType == "varchar" >> lcProc = lcProc + CRLF + TAB + "@" + lcField + ; >> TAB + TAB + lcType + ; >> "(" + TRANSFORM(column_size) + ")" + ; >> " = NULL," >> CASE lcType == "decimal" OR lcType == "numeric" >> lcProc = lcProc + CRLF + TAB + "@" + lcField + ; >> TAB + TAB + lcType + ; >> "(" + TRANSFORM(column_size) + "," + TRANSFORM(decimal_digits) + ")" + ; >> " = NULL," >> CASE lcField == "rowguid" >> *-- Skip the rowguid column >> OTHERWISE >> lcProc = lcProc + CRLF + TAB + "@" + lcField + ; >> TAB + TAB + lcType + " = NULL," >> ENDCASE >>ENDSCAN >> >>*-- Trim off the last comma >>lcProc = LEFT(lcProc, LEN(lcProc) - 1) + CRLF >> >>*TEXT*************************** >>TEXT TO lcProc ADDITIVE TEXTMERGE NOSHOW >>AS >> SET NOCOUNT ON >> >> SET XACT_ABORT ON >> >> BEGIN TRANSACTION >> IF (@<<lcKey>> = 0 OR @<<lcKey>> IS NULL) >> BEGIN >> -- Insert Values into the <<tcTable>> table >> INSERT <<tcTable>> >> >>ENDTEXT >>*ENDTEXT************************ >> >>*-- Create insert field list >>SELECT cTemp >>SCAN >> lcField = LOWER(ALLTRIM(column_name)) >> >> *-- Skip if key field or rowguid >> IF lcField == lcKey OR lcField == "rowguid" >> LOOP >> ENDIF >> >> IF RIGHT(lcProc, 1) <> "," >> *-- Must be first line, add parenthesis >> lcProc = lcProc + TAB + TAB + TAB + "(" + lcField + "," >> ELSE >> lcProc = lcProc + CRLF + TAB + TAB + TAB + lcField + "," >> ENDIF >>ENDSCAN >> >>*-- Trim off the last comma and replace with parenthesis >>lcProc = LEFT(lcProc, LEN(lcProc) - 1) + ")" + CRLF >>lcProc = lcProc + CRLF + CRLF >> >>*-- Create insert value list >>SELECT cTemp >>SCAN >> lcField = LOWER(ALLTRIM(column_name)) >> >> *-- Skip if key field or rowguid >> IF lcField == lcKey OR lcField == "rowguid" >> LOOP >> ENDIF >> >> IF RIGHT(lcProc, 1) <> "," >> *-- Must be first line, add parenthesis >> lcProc = lcProc + TAB + TAB + "SELECT @" + lcField + "," >> ELSE >> lcProc = lcProc + CRLF + TAB + TAB + TAB + "@" + lcField + "," >> ENDIF >>ENDSCAN >> >>*-- Trim off the last comma and replace with parenthesis >>lcProc = LEFT(lcProc, LEN(lcProc) - 1) + CRLF + CRLF >> >>*-- Get the new primary key >>lcProc = lcProc + TAB + TAB + "SELECT @" + lcKey + " = SCOPE_IDENTITY()" + CRLF + CRLF >> >>*-- Now write the ELSE >>*TEXT*************************** >>TEXT TO lcProc ADDITIVE TEXTMERGE NOSHOW >> END >> ELSE >> BEGIN >> -- Update the <<tcTable>> table >> UPDATE <<tcTable>> >> SET >>ENDTEXT >>*ENDTEXT************************ >> >>*-- Create insert field list >>SELECT cTemp >>SCAN >> lcField = LOWER(ALLTRIM(column_name)) >> >> *-- Skip if key field or rowguid >> IF lcField == lcKey OR lcField == "rowguid" >> LOOP >> ENDIF >> >> IF RIGHT(lcProc, 3) == "SET" >> *-- Must be first line, don't add CRLF >> lcProc = lcProc + " " + lcField + " = ISNULL(@" + lcField + ", " + lcField + ")," >> ELSE >> lcProc = lcProc + CRLF + TAB + TAB + " " + lcField + " = ISNULL(@" + lcField + ", " + lcField + ")," >> ENDIF >>ENDSCAN >> >>*-- Trim off the last comma >>lcProc = LEFT(lcProc, LEN(lcProc) - 1) + CRLF >> >>*-- Set the WHERE clause >>lcProc = lcProc + TAB + TAB + "WHERE " + lcKey + " = @" + lcKey + CRLF + TAB + "END" + CRLF + CRLF >> >>*-- Write the footer for the stored proc >>lcProc = lcProc + GetProcFooter() >> >>*-- Clean up and go home >>USE IN cTemp >>RETURN lcProc >>ENDFUNC >> >>>>