zoukankan      html  css  js  c++  java
  • SQL 语句解决实际问题

    在项目开发过程中,遇到数据库的查询问题

    一、查询某表字段的信息

    select * from syscolumns
    SELECT  object_id('TB_KYChildProject')
    select * from syscolumns where id=object_id('TB_KYChildProject') and name='IsInheritAdd'

    二、表字段添加说明

    go
    if exists(select 1 from sys.extended_properties p where
          p.major_id = object_id('TB_KYChildProject')
      and p.minor_id = (select c.column_id from sys.columns c where c.object_id = p.major_id and c.name = 'ChildProjectManageName')
    )
    begin
       declare @CurrentUser sysname
    select @CurrentUser = user_name()
    execute sp_dropextendedproperty 'MS_Description', 
       'user', @CurrentUser, 'table', 'TB_KYChildProject', 'column', 'ChildProjectManageName'
    end
    
    
    select @CurrentUser = user_name()
    execute sp_addextendedproperty 'MS_Description', 
       '子项目经理名称',
       'user', @CurrentUser, 'table', 'TB_KYChildProject', 'column', 'ChildProjectManageName'
     go  

     TB_KYChildProject是表名,ChildProjectManageName字段名,子项目经理名称是字段说明

    三、将查询结果记录转换成 Insert SQL 语句

    USE [BJSkyTwo_Dev]
    GO
    /****** Object:  StoredProcedure [dbo].[pCreateInsertScript]    Script Date: 10/31/2017 15:24:40 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    --@tablename  表名,@con 条件
    --EXEC pCreateInsertScript @tablename = 'Find01_FindSetting',@con = 'Find01Find00ID =58'
    ALTER  proc [dbo].[pCreateInsertScript] (@tablename varchar(256),@IsIncludeIdentityColumn BIT=0,@con varchar(MAX))
    as
    BEGIN
    DECLARE @ID INT
    SET @ID=object_id(@tablename) 
    declare @sql varchar(MAX)
    declare @sqlValues varchar(MAX)
    set @sql =' ('
    set @sqlValues = 'values (''+'
    select @sqlValues = @sqlValues + cols + ' + '','' + ' ,@sql = @sql + '[' + name + '],' 
      from 
          (select case 
                    when xtype in (48,52,56,59,60,62,104,106,108,122,127)                                
                         then 'case when '+ name +' is null then ''NULL'' else ' + 'cast('+ name + ' as varchar)'+' end'
                     
                    when xtype in (58,61)
                         then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast('+ name +' as varchar)'+ '+'''''''''+' end'
                   when xtype in (167)
                         then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'
                    when xtype in (35) 
                         then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'replace('+ 'cast('+ name + ' as varchar)'+','''''''','''''''''''')' + '+'''''''''+' end'
                    when xtype in (231)
                         then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'
                    when xtype in (175)
                         then 'case when '+ name +' is null then ''NULL'' else '+''''''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar)  + '))+'''''''''+' end'
                    when xtype in (239)
                         then 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'cast(replace('+ name+','''''''','''''''''''') as Char(' + cast(length as varchar)  + '))+'''''''''+' end'
     --when xtype in (36)
     ELSE 'case when '+ name +' is null then ''NULL'' else '+'''N'''''' + ' + 'replace('+ name+','''''''','''''''''''')' + '+'''''''''+' end'
      
                    --else '''NULL'''
                  end as Cols,name
             from syscolumns  
            where id = @ID
                AND 1=(CASE WHEN @IsIncludeIdentityColumn=0 AND COLUMNPROPERTY(@ID,[name], 'IsIdentity') = 1 THEN 0 ELSE 1 END) 
          ) T 
    set @sql ='select ''INSERT INTO ['+ @tablename + ']' + left(@sql,len(@sql)-1)+') ' + left(@sqlValues,len(@sqlValues)-4) + ')'' from '+@tablename+' where 1=1 and '+@con
    print @sql
    exec (@sql)
    end

    用法:

    dbo.pCreateInsertScript @tablename = 'System_Menu', -- varchar(256)
        @IsIncludeIdentityColumn = 0, -- bit
        @con = 'MenuName = ''监理任务派单''' -- varchar(max)

     存在的问题:

    PRINT只能打印4000的Unicode string或8000的Non-unicode string,过长会导致字符串被截断

    四、外键ID字符串拼接成对应名称字符串


    转换成

    方法一:

    SELECT  a.userID ,
            STUFF(( SELECT  ',' + System_Role.RoleName
                    FROM    System_Role
                    WHERE   CHARINDEX(','
                                      + CONVERT(VARCHAR(36), System_Role.RoleID)
                                      + ',', ',' + a.RoleIDs + ',') > 0
                    ORDER BY System_Role.RoleID
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS RoleNames
    FROM    System_Users a

    方法二:

    WITH    mt
              AS ( SELECT   a.UserID ,
                            b.RoleID ,
                            b.RoleName
                   FROM     System_Users a ,
                            System_Role b
                   WHERE    ',' + a.RoleIDs + ',' LIKE '%,'
                            + CONVERT(VARCHAR(36), b.RoleID) + ',%'
                 )
        SELECT  UserID ,
                STUFF(( SELECT  ',' + RoleName
                        FROM    mt a
                        WHERE   a.UserID = mt.UserID
                      FOR
                        XML PATH('')
                      ), 1, 1, '') RoleNames
        FROM    mt
        GROUP BY UserID 

    五、统计某个类型占总数的比例

    SELECT  
            SUM(CASE WHEN a.Sub_Project_Type =101 THEN 1
                     ELSE 0
                END)*1.0  / COUNT(*) 类型比例
    FROM    TB_KYSubProject a

    效果:

    六、用户所属的专业类型

    思路一:

    SELECT  a.* ,
            STUFF(( SELECT  ',' + CONVERT(VARCHAR(100), b.RoleMajorType)
                    FROM    System_Role b
                    WHERE   CHARINDEX(',' + CONVERT(VARCHAR(36), b.RoleID) + ',',
                                      ',' + a.RoleIDs + ',') > 0
                    GROUP BY b.RoleMajorType
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS RoleMajorType
    FROM    System_Users a

    效果:

    思路二(不推荐):

    SELECT  a.* ,
            STUFF(( SELECT  DISTINCT
                            ( ',' + CONVERT(NVARCHAR(10), r.RoleMajorType) )
                    FROM    ( SELECT    a.UserID ,
                                        b.RoleID
                              FROM      System_Users a
                                        CROSS APPLY ( SELECT    CAST(col AS UNIQUEIDENTIFIER) RoleID
                                                      FROM      fn_split(RoleIDs,
                                                                  ',')
                                                    ) b
                            ) ru
                            LEFT JOIN dbo.System_Role r ON r.RoleID = ru.RoleID
                    WHERE   ru.UserID = a.UserID
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS RoleMajorType
    FROM    System_Users a
    WHERE   1 = 1

     效果:

    七、截取字符串

    1|216|368|截取成1|216|,1|2112|3683|21|截取成1|2112|

     推荐

    select LEFT('1|216|368|',CHARINDEX ('|', '1|216|368|' , CHARINDEX ('|', '1|216|368|')+1))

     不推荐

    select LEFT('1|216|368|',charindex('|',stuff('1|216|368|',charindex('|','1|216|368|'),1,',')))
    学习,以记之。如有错漏,欢迎指正

    作者:冯子武
    出处:http://www.cnblogs.com/Zev_Fung/
    本文版权归作者和博客园所有,欢迎转载,转载请标明出处。
    如果博文对您有所收获,请点击下方的 [推荐],谢谢

  • 相关阅读:
    Js全选 添加和单独删除
    H5新手快速入门 简单布局
    DOM 节点 课程表
    Datalogic组网模式下通讯
    svn检出的时候报 Unable to connect to a repository at URL错误(摘自CSDN)
    Subsonic使用中
    HTTP 错误 500.21
    WinForm下增加声音提示
    IIS7.0发布Web服务器0002
    IIS7.0发布Web服务-0001
  • 原文地址:https://www.cnblogs.com/Zev_Fung/p/7644440.html
Copyright © 2011-2022 走看看