sqlserver ,通过表名生成update和insert语句!

这个存储过程(pro_savedata)用于根据输入的表名和标记,动态生成SQL Server的UPDATE或INSERT语句。当标记为1时,生成UPDATE语句;为0时,生成INSERT语句。通过游标遍历指定表的所有列,构造相应的WHERE条件和SET或VALUES子句。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE PROCEDURE [dbo].[pro_savedata]

    @TABLENAME VARCHAR(50),/*ログインユーザコード*/
    @SAVEFLG INT ,/* 画面のTAG値 */
    @RETURNSQL VARCHAR(7000) ='0' OUTPUT
AS
 DECLARE @NAME VARCHAR(60)
 DECLARE @KEYNAME VARCHAR(60)             
    DECLARE @SQLHEADER VARCHAR(60)
    DECLARE @SQLBUILD VARCHAR(3000)
    DECLARE @SQLWHEREHEADER VARCHAR(60)
    DECLARE @SQLWHERE VARCHAR(3000)
    DECLARE @SQLHEADER_INSERTUP VARCHAR(2000)
    DECLARE @SQLHEADER_INSERTDOWN VARCHAR(2000)

DECLARE CURGETCOLUMN CURSOR FAST_FORWARD
 FOR 
SELECT NAME, ISNULL(KENT.KEYNAME, 0) AS KEYNAME
  FROM SYSCOLUMNS
  LEFT JOIN (SELECT SYSCOLUMNS.NAME KEYNAME
               FROM SYSCOLUMNS, SYSOBJECTS
              WHERE SYSCOLUMNS.ID = SYSOBJECTS.ID
                AND SYSOBJECTS.NAME = @TABLENAME
                AND SYSCOLUMNS.COLID IN
                    (SELECT COLID
                       FROM SYSOBJECTS, SYSINDEXKEYS
                      WHERE SYSINDEXKEYS.ID = SYSOBJECTS.ID
                        AND SYSOBJECTS.NAME = @TABLENAME)) AS KENT ON NAME =
                                                                            KENT.KEYNAME
 WHERE ID = OBJECT_ID(@TABLENAME)

IF @SAVEFLG = '1'
BEGIN
 SET @SQLHEADER='UPDATE '+@TABLENAME + ' SET '
 SET @SQLWHEREHEADER = ' WHERE '
 SET @SQLBUILD = ''
 SET @SQLWHERE = ''
 OPEN CURGETCOLUMN
 FETCH CURGETCOLUMN INTO   @NAME, --COLNAME
     @KEYNAME   --COLNAMEKEY

 WHILE @@FETCH_STATUS = 0
 BEGIN          
  IF LTRIM(RTRIM(@KEYNAME)) <> '0'
   BEGIN 
      
    SET  @SQLWHERE =@SQLWHERE+ @KEYNAME + '= @' + @KEYNAME +' AND '
   END
  ELSE
            BEGIN
                IF NOT ( @NAME= 'INS_EMP_CD' OR @NAME= 'INS_DATE')
     SET @SQLBUILD = @SQLBUILD+ @NAME + ' = @' + @NAME+','
   END
    FETCH CURGETCOLUMN INTO   @NAME,    --COLNAME
                  @KEYNAME     
 END
    CLOSE CURGETCOLUMN
    DEALLOCATE CURGETCOLUMN

 SET @SQLWHERE = LEFT(@SQLWHERE,LEN(@SQLWHERE)-4)
 SET @RETURNSQL= @SQLHEADER + @SQLBUILD+@SQLWHEREHEADER + @SQLWHERE
    SET @RETURNSQL = REPLACE(@RETURNSQL,', WHERE ',' WHERE ')

 RETURN 
END

IF @SAVEFLG = '0' 
BEGIN
 SET @SQLHEADER='INSERT INTO '+@TABLENAME + '('
 SET @SQLHEADER_INSERTUP = ''
 SET @SQLHEADER_INSERTdown = ''
 OPEN CURGETCOLUMN
 FETCH CURGETCOLUMN INTO   @NAME, --COLNAME
     @KEYNAME   --COLNAMEKEY
 WHILE @@FETCH_STATUS = 0
 BEGIN    
       SET @SQLHEADER_INSERTUP = @SQLHEADER_INSERTUP + @NAME+','
       SET @SQLHEADER_INSERTDOWN = @SQLHEADER_INSERTDOWN +'@'+ @NAME+','  
  
    FETCH CURGETCOLUMN INTO   @NAME,    --COLNAME
     @KEYNAME     
 END
 CLOSE CURGETCOLUMN
 DEALLOCATE CURGETCOLUMN 
   
 SET @RETURNSQL= @SQLHEADER + RTRIM(@SQLHEADER_INSERTUP)+')VALUES ('+RTRIM(@SQLHEADER_INSERTDOWN) +')' 
    SET @RETURNSQL = REPLACE(@RETURNSQL,',)',')')
 
 RETURN 

END

 

 

调用方法

Private Function ExcuteUpdateDB(ByRef objData As Utility.DbAccess, _
                                ByVal imgdata() As Byte, ByVal strTime As String) As Boolean

        Dim strOut As String                        'チェック戻る値
        Dim sqlparamsUpdate(13) As SqlParameter            '引数

        Try

            '更新のSQL文取り
            strOut = Fn_GetDBSql(objData, "employee", 1)

 

            sqlparamsUpdate(0) = New SqlParameter("@empcd", SqlDbType.Char, 4) '担当者コード
            sqlparamsUpdate(1) = New SqlParameter("@empname", SqlDbType.VarChar, 20) '担当者名
              

 

 

            sqlparamsUpdate(0).Value = getConvertNull(getEscape(txtCode.Text.Trim))
            sqlparamsUpdate(1).Value = getConvertNull(getEscape(txtMei.Text.Trim))


            objData.ExcuteSpNonQueryImage(strOut, sqlparamsUpdate)

 

            Return True

        Catch ex As Exception

            Throw
        End Try

    End Function

 

 

调用方法2

    Public Shared Function Fn_GetDBSql(ByRef objData As Utility.DbAccess, _
                                                             ByVal strTableName As String, _
                                                             ByVal intFlg As Integer) As String
        Dim sqlProcedureName As String              'システムストアドプロシージ
        Dim sqlparams(2) As SqlParameter            '引数
        Dim strOut As String

        Try
            'ストアドプロシージ名をセットする。
            sqlProcedureName = "PRO_SAVEDATA"

            sqlparams(0) = New SqlParameter("@TableName", SqlDbType.VarChar, 50)        'テーブル名
            sqlparams(1) = New SqlParameter("@SaveFlg", SqlDbType.Int)
            sqlparams(2) = New SqlParameter("@ReturnSql", SqlDbType.VarChar, 4000)      'SQL文

            sqlparams(0).Direction = ParameterDirection.Input
            sqlparams(1).Direction = ParameterDirection.Input
            sqlparams(2).Direction = ParameterDirection.Output

            sqlparams(0).Value = strTableName
            sqlparams(1).Value = intFlg
            sqlparams(2).Value = "0"

            objData.ExcuteSpNonQuery(sqlProcedureName, sqlparams)

            '戻りSQL文
            strOut = sqlparams(2).Value

            Return strOut.Trim

        Catch ex As Exception

            Throw Utility.KTException.KTException(ex, enuExceptionType.DBException)
        End Try

    End Function

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值