SQL[游标+动态SQL+表函数]返回指定表名的某行的所有列合并后的值,主要提供给数据库表的更新记录事件


Create PROCEDURE [dbo].[SysGetTableFieldsCombine] 

-- =============================================
-- Description:    <返回指定表名的某行的所有列合并后的值,主要提供给数据库表的更新记录事件>
-- Return 0- 成功, -1- 没有这个表
-- Rev: 1.00
-- =============================================
@ObjectName Nvarchar(100) ='',
@ObjectPKId char(12)='',
@CombineFieldsValue nvarchar(max) ='' output 

AS

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

--判断表名是否存在
if object_id(@ObjectName) is null
    return -1

--定义一个内存表,用来获取该表的所有字段清单
declare @tempFields table(ObjectColumnName nvarchar(100),ObjectColumnType nvarchar(100))

insert  into  @tempFields 
        SELECT     c.name AS ObjectColumnName,t.name AS ObjectColumnType
        FROM       sys.syscolumns AS c INNER JOIN
                   sys.systypes AS t ON c.xusertype = t.xusertype
        WHERE     (id = Object_Id(@ObjectName))
        ORDER BY colorder

--定义游标,开始拼接一个SQL查询字串
declare @SQLString nvarchar(max)
declare @ObjectColumnName nvarchar(100)
declare @PKFieldName nvarchar(100)
declare @CombineField nvarchar(200)
declare @Paramstring nvarchar(100)
declare @ObjectColumnType nvarchar(100)

set @SQLString='select @CField='
set @PKFieldName=''

DECLARE   My_cursor   CURSOR   FOR  SELECT   --定义一个游标
                ObjectColumnName,ObjectColumnType FROM   @tempFields 

    OPEN   My_cursor      
    FETCH   NEXT   FROM   My_cursor INTO
                 @ObjectColumnName,@ObjectColumnType

    WHILE @@fetch_status = 0 
    begin
        IF @@fetch_status = -2
        CONTINUE

        if @ObjectColumnType<>'varbinary' and @ObjectColumnType<>'uniqueidentifier'
            and @ObjectColumnType<>'timestamp' and @ObjectColumnType<>'image'
            and @ObjectColumnType<>'binary'
        begin
            set @CombineField=''    
            IF @ObjectColumnType <> 'datetime' 
                SET @CombineField=''' ['+@ObjectColumnName+']''+rtrim(convert(nvarchar,isnull(convert(nvarchar,' + @ObjectColumnName + '),'''')))'         
            ELSE
                SET @CombineField=''' ['+@ObjectColumnName+']''+rtrim(convert(nvarchar,isnull(convert(nvarchar,' + @ObjectColumnName + ',121),'''')))' 
                
                    
            if @PKFieldName=''  
            begin
                set @SQLString=@SQLString+    @CombineField
            end
            else
            begin
                set @SQLString=@SQLString+ '+'+ @CombineField    
            end

            if @PKFieldName=''   --获取主PK字段的名称
                set @PKFieldName=@ObjectColumnName
        end

        FETCH NEXT FROM My_cursor  INTO 
                @ObjectColumnName,@ObjectColumnType
    end

DEALLOCATE My_cursor  

set @SQLString=@SQLString+'  from '+ @ObjectName+ ' where ' + @PKFieldName + ' =''' + @ObjectPKId + ''''
set @Paramstring='@CField nvarchar(max) output'

--动态执行SQL,同时从内部返回变量
EXECUTE sp_executesql @SQLString,@Paramstring,@CField=@CombineFieldsValue output

return 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值