Chinaunix首页 | 论坛 | 博客
  • 博客访问: 523405
  • 博文数量: 576
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5020
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(576)

文章存档

2011年(1)

2008年(575)

我的朋友

分类:

2008-10-14 14:53:37

Generated T-SQL Script
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

UDF
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)

Set up the Variables
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 Some Values
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 Cursor and Read
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

Create the Parameter List
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

Create the SET Clause
IF (@bPrimaryKeyColumn = 0)
 BEGIN
    IF (@sSetClause = '')
        SET @sSetClause = 'SET'
    ELSE
        SET @sSetClause = @sSetClause + ',' + @sCRLF 

    SET @sSetClause = @sSetClause + @sTAB + @sColumnName  + ' = '

    SET @sSetClause = @sSetClause + '@' + @sColumnName 

 END

Create the WHERE, if Necessary
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

Print the Procedure
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)


--------------------next---------------------

阅读(191) | 评论(0) | 转发(0) |
0

上一篇:VC知识库>>代码仓库

下一篇:Figures

给主人留下些什么吧!~~