关于Select Where In 的排序问题

复制代码 代码如下:Select* FROMtable1
Where(IDIN(3,5,1,4,2卡塔尔国State of Qatar复制代码
代码如下:Select* FROMtable1
Where(IDIN(3,5,1,4,2卡塔尔(قطر‎State of Qatar假设In前边的尺码都以数字,那MSSQL排序应该为 复制代码 代码如下:Select* FROMtable1
Where(IDIN(3,5,1,4,2卡塔尔(قطر‎State of QatarorDERBYCHA传祺INDEX(‘,’+CONVERT(nvarchar,ID卡塔尔(قطر‎+’,’,’,’+CONVERT(nvarchar,Replace(‘3,5,1,4,2′,”,”卡塔尔(قطر‎卡塔尔+’,’卡塔尔(قطر‎复制代码 代码如下:Select* FROMtable1
Where(IDIN(3,5,1,4,2State of Qatar卡塔尔orDERBYCHA兰德奔驰M级INDEX(‘,’+CONVERT(nvarchar,ID卡塔尔+’,’,’,’+CONVERT(nvarchar,Replace(‘3,5,1,4,2′,”,”State of Qatar卡塔尔国+’,’卡塔尔国改革方式,不去管理空格,直接改用空格推断.能够用来剖断少数有空格的字符条件.复制代码 代码如下:Select* FROMtable1
Where(IDIN(3,5,1,4,2State of Qatar卡塔尔orDERBYPATINDEX(‘%’+CONVERT(nvarchar(4000卡塔尔国,IDState of Qatar+’%’,”+CONVERT(nvarchar(4000卡塔尔(قطر‎,Replace(‘3,5,1,4,2′,’,’,’,’卡塔尔(قطر‎卡塔尔国+”State of Qatar复制代码 代码如下:Select* FROMtable1
Where(IDIN(3,5,1,4,2State of Qatar卡塔尔国orDERBYPATINDEX(‘%’+CONVERT(nvarchar(4000卡塔尔(قطر‎,ID卡塔尔(قطر‎+’%’,”+CONVERT(nvarchar(4000State of Qatar,Replace(‘3,5,1,4,2′,’,’,’,’卡塔尔卡塔尔(قطر‎+”卡塔尔国其实如故在SQL外管理好标准字符串再开展询问和排序比较好.
对于MYSQL排序恐怕要改为(MYSQL不熟卡塔尔(قطر‎:复制代码 代码如下:Select* FROMtable1
Where(IDIN(3,5,1,4,2)) orDERBYFIND_IN_SET(ID,’3,5,1,4,2′)

Set @ProcName=N’r’+@object+N’ForAll’
Set @sql=N’If object_id(”’+@ProcName+N”’) Is Not Null ‘+@Enter+@Tab+N’Drop Proc ‘+@ProcName+@Enter+’Go’+@Enter+
            N’Create Proc ‘+@ProcName+@Enter+N’As’+@Enter+
            N’Select’+@Tab+Replace(Stuff((Select N’,’+Quotename(name) From #Columns Order By seq For Xml Path(”)),1,1,”),N’,’,N’,’+@Enter+@Tab+@Tab)+@Enter+@Tab+
            N’From ‘+Quotename(@object)+@Enter+N’Go’
Print @sql
        
Set @ProcName=N’r’+@object+N’By’+Stuff((Select N’And’+name From #Columns Where is_primary_key=1 Order By seq For Xml Path(”)),1,3,”)
Set @sql=N’If object_id(”’+@ProcName+N”’) Is Not Null ‘+@Enter+@Tab+N’Drop Proc ‘+@ProcName+@Enter+’Go’+@Enter+
            N’Create Proc ‘+@ProcName+@Enter+N'(‘+@Enter+@Tab+Replace(Stuff((Select N’@,@’+name+N’ ‘+type From #Columns Where is_primary_key=1 Order By seq For Xml Path(”)),1,2,”),N’@,’,N’,’+@Enter+@Tab)+@Enter+N’)’+@Enter+N’As’+@Enter+
            N’Select’+@Tab+Replace(Stuff((Select N’,’+Quotename(name) From #Columns Order By seq For Xml Path(”)),1,1,”),N’,’,N’,’+@Enter+@Tab+@Tab)+@Enter+@Tab+
            N’From ‘+Quotename(@object)+@Enter+@Tab+
            N’Where ‘+Replace(Stuff((Select N’,’+Quotename(name)+N’=@’+name From #Columns Where is_primary_key=1 Order By seq For Xml Path(”)),1,1,”),N’,’,@Enter+@Tab+@Tab+@Tab+N’And ‘)+@Enter+N’Go’
Print @sql

Use Test;
Go
If Object_id(‘[MyExecuteSql]’,’P’) Is Not null
    Drop Proc [MyExecuteSql]
Go
Create Proc [dbo].[MyExecuteSql]
(
    @stmt nvarchar(Max),
    @params nvarchar(Max)=null,
    @param1 nvarchar(Max)=null output,
    @param2 nvarchar(Max)=null output,
    @param3 nvarchar(Max)=null output,
    @param4 nvarchar(Max)=null output,
    @param5 nvarchar(Max)=null output,
    @param6 nvarchar(Max)=null output,
澳门金沙vip,    @param7 nvarchar(Max)=null output,
    @param8 nvarchar(Max)=null output,
    @param9 nvarchar(Max)=null output
)
As
    Set Nocount On
Begin Try
    Declare 
        @xml xml, 
        @tmp1 nvarchar(1024),
        @tmp2 nvarchar(1024),
        @Define nvarchar(Max),
        @Set nvarchar(Max),
        @Update nvarchar(Max)

 上面包车型大巴本子能够兑现轻巧的curd成效。

调用[MyExecuteSql]:
                                                            

  CRUD 定义了用于拍卖数据的骨干原子操作。

输出 @x=281.550
*/

  它代表创设(Create)、读取(Read)更新(Update)和删除(Delete)操作。

测试:

 


Set @ProcName=N’c’+@object
Set @sql=N’If object_id(”’+@ProcName+N”’) Is Not Null ‘+@Enter+@Tab+N’Drop Proc ‘+@ProcName+@Enter+’Go’+@Enter+
            N’Create Proc ‘+@ProcName+@Enter+N'(‘+@Enter+@Tab+Replace(Stuff((Select N’@,@’+name+N’ ‘+type+Case is_identity When 1 Then N’ Output’ Else ” End From #Columns Order By seq For Xml Path(”)),1,2,”),N’@,’,N’,’+@Enter+@Tab)+@Enter+N’)’+@Enter+N’As’+@Enter+
            N’Insert Into ‘+Quotename(@object)+N'(‘+Stuff((Select N’,’+Quotename(name) From #Columns Where is_identity=0 Order By seq For Xml Path(”)),1,1,”)+N’)’+@Enter+@Tab+
            N’Select ‘+Stuff((Select N’,@’+name From #Columns Where is_identity=0 Order By seq For Xml Path(”)),1,1,”)+@Enter+
            Isnull((Select N’Set @’+name+N’=Scope_identity()’ From #Columns Where is_identity=1),”)+@Enter+N’Go’
Print @sql

Print ‘输出 @x=’+Rtrim(@x)

实践结果:

exec [MyExecuteSql]
‘Select @2=@2*5;Select @1,@2,@3’,
‘@1 nvarchar(20   )  input  ,@2 numeric(12,  3) output , @3   int ‘
,’sdf’,@x output,34

Print N’Use ‘+Quotename(db_name())+@Enter+N’Go’

参照个中的片段参数的,重回的不二秘诀,这里塑造二个MyExecuteSql的囤积进度,作用与sp_executesql相似。
这里提供能够输入9个可变参数,当然能够凭借自个儿的爱怜扩充越多的参数。

Set @object=object_name(object_id(@object))
If object_id(‘tempdb..#columns’) Is Not Null
    Drop Table #columns

    If Object_id(‘tempdb..#’) Is Not null
        Drop Table #
    Create Table #
    (    id smallint Identity(1,1) Not null,
        param nvarchar(1024),
        datatype nvarchar(1024),
        flag char(1),
        value nvarchar(max),
        IsOutPut bit
    )
    /*    筛分 @params */
    Set @xml=Convert(xml,Stuff(Replace(@params+’,’,’@’,'</a><a>@’),1,4,”)+'</a>’)
    Insert Into # (datatype)
        Select t.m.value(‘.’,’nvarchar(1024)’)
        From @xml.nodes(‘/a’) t(m)
    
    Update # 
        Set    @tmp1=Left(datatype,CharIndex(‘ ‘,datatype)-1),
            param=@tmp1,
            IsOutPut=Case When Charindex(‘ out’,datatype)>0 Then 1 Else 0 End ,
            @tmp2=Reverse(Stuff(Reverse(Replace(Replace(Replace(Replace(Replace(datatype,@tmp1,”),’ output’,”),’ out’,”),’input’,”),’ ‘,”)),1,1,”)),
            datatype=@tmp2,
            flag=Case When 
                    CharIndex(‘tinyint’,@tmp2)>0 Or
                    CharIndex(‘smallint’,@tmp2)>0 Or
                    CharIndex(‘int’,@tmp2)>0 Or
                    CharIndex(‘real’,@tmp2)>0 Or
                    CharIndex(‘money’,@tmp2)>0 Or
                    CharIndex(‘float’,@tmp2)>0 Or
                    CharIndex(‘bit’,@tmp2)>0 Or
                    CharIndex(‘decimal’,@tmp2)>0 Or
                    CharIndex(‘numeric’,@tmp2)>0 Or
                    CharIndex(‘smallmoney’,@tmp2)>0 Or
                    CharIndex(‘bigint’,@tmp2)>0 Or
                    CharIndex(‘varbinary’,@tmp2)>0 Or
                    CharIndex(‘binary’,@tmp2)>0 Or
                    CharIndex(‘timestamp’,@tmp2)>0
                Then ” Else ”” End                    

Declare @sql nvarchar(4000),
        @ProcName sysname,
        @Enter nvarchar(2),
        @Tab nvarchar(1)

Declare @x numeric(12,3)
Set @x=56.31
Print ‘结果:’
Print ‘开始 @x=’+Rtrim(@x)+char(13)+char(10)+char(13)+char(10)+’调用[MyExecuteSql]:’