• 在 sql server 查询子句中 , 把 in 的目标参数化


    例如以下的sql语句

    select * from Tags 
    where Name in('ruby','rails','scruffy','rubyonrails')

    写成这样, 编译不通过

    declare @nameList nvarchar(100)
    select @nameList = 'aaa,bbb,ccc,ddd'
    select * from Tags 
    where Name in @nameList

    如果还是想简单的传入一个字符串代表 in  的目标 , 可以:

    一 : 先建一个函数 , split 传入的参数 , 存到临时表里

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE FUNCTION [dbo].[fnSplit](
        @sInputList VARCHAR(8000) -- List of delimited items
      , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
    ) RETURNS @List TABLE (item VARCHAR(8000))
    
    BEGIN
    DECLARE @sItem VARCHAR(8000)
    WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
     BEGIN
     SELECT
      @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
      @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))
    
     IF LEN(@sItem) > 0
      INSERT INTO @List SELECT @sItem
     END
    
    IF LEN(@sInputList) > 0
     INSERT INTO @List SELECT @sInputList -- Put the last item in
    RETURN
    END

    二 : 然后把改写 sql语句

    DECLARE @tags
    SET @tags = ‘ruby,rails,scruffy,rubyonrails’ select * from Tags where Name in (SELECT item from fnSplit(@tags, ‘,’))

    三: 这样,所有的拆分工作都放在数据库完成, 外部程序只需传入一个简单的字符串就可以。

    此方法来自 stackoverflow, 原帖地址见

    http://stackoverflow.com/questions/337704/parameterizing-an-sql-in-clause?rq=1

  • 相关阅读:
    web前端学习笔记(CSS盒子的定位)
    web前端学习笔记(CSS盒子的浮动)
    数百篇「原创」文章,助你完成技术「体系化」
    linux quota磁盘限额,引发的rename系统调用 errno:18
    dnsperf
    stop容器,把信号量传给java进程,优雅退出
    JNA 调用操作系统函数 和 系统调用
    自顶向下深入分析Netty(五)--Future
    来测试下你的Java编程能力
    Netty笔记
  • 原文地址:https://www.cnblogs.com/lthxk-yl/p/3535016.html
Copyright © 2020-2023  润新知