分类:
2008-10-14 14:53:37
IF EXISTS(SELECT * FROM sysobjects WHERE name = 'prApp_Order_Details_Update') DROP PROC prApp_Order_Details_Update GO -- Update a single record in Order_Details CREATE PROC prApp_Order_Details_Update @OrderID int, @ProductID int, @UnitPrice money, @Quantity smallint, @Discount real AS UPDATE Order_Details SET UnitPrice = @UnitPrice, Quantity = @Quantity, Discount = @Discount WHERE OrderID = @OrderID AND ProductID = @ProductID GO
CREATE FUNCTION dbo.fnTableColumnInfo(@sTableName varchar(128)) RETURNS TABLE AS RETURN SELECT c.name AS sColumnName, c.colid AS nColumnID, dbo.fnIsColumnPrimaryKey(@sTableName, c.name) AS bPrimaryKeyColumn, CASE WHEN t.name IN ('char', 'varchar', 'binary', 'varbinary', 'nchar', 'nvarchar') THEN 1 WHEN t.name IN ('decimal', 'numeric') THEN 2 ELSE 0 END AS nAlternateType, c.length AS nColumnLength, c.prec AS nColumnPrecision, c.scale AS nColumnScale, c.IsNullable, SIGN(c.status & 128) AS IsIdentity, t.name as sTypeName, dbo.fnColumnDefault(@sTableName, c.name) AS sDefaultValue FROM syscolumns c INNER JOIN systypes t ON c.xtype = t.xtype and c.usertype = t.usertype WHERE c.id = OBJECT_ID(@sTableName)
CREATE PROC pr__SYS_MakeUpdateRecordProc @sTableName varchar(128), @bExecute bit = 0 AS IF dbo.fnTableHasPrimaryKey(@sTableName) = 0 BEGIN RAISERROR ('Procedure cannot be created on a table with no primary key.', 10, 1) RETURN END DECLARE @sProcText varchar(8000), @sKeyFields varchar(2000), @sSetClause varchar(2000), @sWhereClause varchar(2000), @sColumnName varchar(128), @nColumnID smallint, @bPrimaryKeyColumn bit, @nAlternateType int, @nColumnLength int, @nColumnPrecision int, @nColumnScale int, @IsNullable bit, @IsIdentity int, @sTypeName varchar(128), @sDefaultValue varchar(4000), @sCRLF char(2), @sTAB char(1) SET @sTAB = char(9) SET @sCRLF = char(13) + char(10) SET @sProcText = '' SET @sKeyFields = '' SET @sSetClause = '' SET @sWhereClause = ''
SET @sProcText = @sProcText + 'IF EXISTS(SELECT * FROM sysobjects WHERE name = ''prApp_' + @sTableName + '_Update'')' + @sCRLF SET @sProcText = @sProcText + @sTAB + 'DROP PROC prApp_' + @sTableName + '_Update' + @sCRLF IF @bExecute = 0 SET @sProcText = @sProcText + 'GO' + @sCRLF SET @sProcText = @sProcText + @sCRLF PRINT @sProcText IF @bExecute = 1 EXEC (@sProcText) SET @sProcText = '' SET @sProcText = @sProcText + '' + @sCRLF SET @sProcText = @sProcText + ' Update a single record in ' + @sTableName + @sCRLF SET @sProcText = @sProcText + '' + @sCRLF SET @sProcText = @sProcText + 'CREATE PROC prApp_' + @sTableName + '_Update' + @sCRLF
DECLARE crKeyFields cursor for SELECT * FROM dbo.fnTableColumnInfo(@sTableName) ORDER BY 2 OPEN crKeyFields FETCH NEXT FROM crKeyFields INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType, @nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable, @IsIdentity, @sTypeName, @sDefaultValue WHILE (@@FETCH_STATUS = 0) BEGIN
IF (@sKeyFields <> '') SET @sKeyFields = @sKeyFields + ',' + @sCRLF SET @sKeyFields = @sKeyFields + @sTAB + '@' + @sColumnName + ' ' + @sTypeName IF (@nAlternateType = 2) decimal, numeric SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnPrecision AS varchar(3)) + ', ' + CAST(@nColumnScale AS varchar(3)) + ')' ELSE IF (@nAlternateType = 1) character and binary SET @sKeyFields = @sKeyFields + '(' + CAST(@nColumnLength AS varchar(4)) + ')' IF (@IsIdentity = 0) BEGIN IF (@IsNullable = 1) OR (@sTypeName = 'timestamp') SET @sKeyFields = @sKeyFields + ' = NULL' END
IF (@bPrimaryKeyColumn = 0) BEGIN IF (@sSetClause = '') SET @sSetClause = 'SET' ELSE SET @sSetClause = @sSetClause + ',' + @sCRLF SET @sSetClause = @sSetClause + @sTAB + @sColumnName + ' = ' SET @sSetClause = @sSetClause + '@' + @sColumnName END
ELSE BEGIN IF (@sWhereClause = '') SET @sWhereClause = @sWhereClause + 'WHERE ' ELSE SET @sWhereClause = @sWhereClause + ' AND ' SET @sWhereClause = @sWhereClause + @sTAB + @sColumnName + ' = @' + @sColumnName + @sCRLF END FETCH NEXT FROM crKeyFields INTO @sColumnName, @nColumnID, @bPrimaryKeyColumn, @nAlternateType, @nColumnLength, @nColumnPrecision, @nColumnScale, @IsNullable, @IsIdentity, @sTypeName, @sDefaultValue END CLOSE crKeyFields DEALLOCATE crKeyFields
SET @sSetClause = @sSetClause + @sCRLF SET @sProcText = @sProcText + @sKeyFields + @sCRLF SET @sProcText = @sProcText + 'AS' + @sCRLF SET @sProcText = @sProcText + @sCRLF SET @sProcText = @sProcText + 'UPDATE ' + @sTableName + @sCRLF SET @sProcText = @sProcText + @sSetClause SET @sProcText = @sProcText + @sWhereClause SET @sProcText = @sProcText + @sCRLF IF @bExecute = 0 SET @sProcText = @sProcText + 'GO' + @sCRLF PRINT @sProcText IF @bExecute = 1 EXEC (@sProcText)