• 在 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

  • 相关阅读:
    业余爱好很有必要
    平和的心态
    合理预期
    有所为,有所不为
    iOS中使用UITextView设置不同文本部分点击事件小结
    一直在路上
    Windows平台交叉编译Arm Linux平台的QT5.7库
    UOS创建开机自启程序或脚本
    HTTP HTTP请求报文和响应报文的格式
    ObjectObject.prototype.toString.call()方法的使用
  • 原文地址:https://www.cnblogs.com/lthxk-yl/p/3535016.html
Copyright © 2020-2023  润新知