none
这个参数怎样赋值??? RRS feed

  • 问题

  • Sql直接写死:    buildingno  in    ('310000Fa001','310000Fe001')

    在存储过程中使用参数:from     EnergyDataSumByHour    where    BuildingNo    in     (@TargetValue)    and    EnergyType  =  @EType

    问题:在执行存储过程时怎样给“@TargetValue”参数赋值???       

              @TargetValue='''310000Fa001,310000Fe001'''     这样赋值不对啊???    怎么写才对???

     


    Science and technology is my lover.

    2012年9月11日 8:02

答案

  • 写之前最好用print打印出来看一下对不对

       DECLARE @TargetValue1 INT
       DECLARE @TargetValue2 INT
       SELECT   @TargetValue1 = 700 ,
                @TargetValue2 = 800
      
    
       DECLARE @cdtsql NVARCHAR(4000)
       SET @cdtsql = ' in(' + CAST(@TargetValue1 AS NVARCHAR(50)) + ','
        + CAST(@TargetValue2 AS NVARCHAR(50)) + ')'
       
            
       
       
       PRINT ( ' SELECT  * from   dbo.Orders   where  ProductID ' + @cdtsql )

    查看adventureworks数据库里的SalesOrderDetail表里的productid的范围

    USE [pratice]
    GO
    /****** 对象:  StoredProcedure [dbo].[CT_CardType_Get]    脚本日期: 09/12/2012 00:00:42 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    /****** 对象:  StoredProcedure [dbo].[CT_CardType_Get]    脚本日期: 09/09/2012 22:16:06 ******
    */	
    ALTER PROCEDURE [dbo].[CT_CardType_Get]
        (
          @TargetValue1 INT ,
          @TargetValue2 INT
        )
    AS 
        BEGIN
            DECLARE @cdtsql NVARCHAR(4000)
            SET @cdtsql = ' in(' + CAST(@TargetValue1 AS NVARCHAR(50)) + ','
                + CAST(@TargetValue2 AS NVARCHAR(50)) + ')'
       
            
       
       
            EXECUTE(' SELECT  * from   dbo.Orders   where  ProductID ' + @cdtsql)
    	
    	
        END
    


    给我写信: QQ我:点击这里给我发消息

    2012年9月11日 16:01
  • 明白了  In 后面跟的是参数列表  “in(@A, @B)”这是不同的参数,“@A”和“@B”表示不同参数。而不能用一个“@A”表示所有的参数。

    Science and technology is my lover.

    2012年9月13日 2:54
  • BuildingNo    in     (@TargetValue)

    条件可改为

    ','+@TargetValue+','  like  +','+BuildingNo+','

    不用动态时可用

    SQL05可用XML传参

    SQL08可用表类型传参


    Roy Wu(吳熹Blog)(微博)

    2012年9月15日 13:28
    版主

全部回复

  • BuildingNo in (@TargetValue)

    这个用法就有问题,in 后面是表达式列表(特别注意是列表),所以你的那个变量只是列表中的一个值,不是一个列表

    通过这种是通过拼 T-SQL 来处理的

    2012年9月11日 8:14
  • 写之前最好用print打印出来看一下对不对

       DECLARE @TargetValue1 INT
       DECLARE @TargetValue2 INT
       SELECT   @TargetValue1 = 700 ,
                @TargetValue2 = 800
      
    
       DECLARE @cdtsql NVARCHAR(4000)
       SET @cdtsql = ' in(' + CAST(@TargetValue1 AS NVARCHAR(50)) + ','
        + CAST(@TargetValue2 AS NVARCHAR(50)) + ')'
       
            
       
       
       PRINT ( ' SELECT  * from   dbo.Orders   where  ProductID ' + @cdtsql )

    查看adventureworks数据库里的SalesOrderDetail表里的productid的范围

    USE [pratice]
    GO
    /****** 对象:  StoredProcedure [dbo].[CT_CardType_Get]    脚本日期: 09/12/2012 00:00:42 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    /****** 对象:  StoredProcedure [dbo].[CT_CardType_Get]    脚本日期: 09/09/2012 22:16:06 ******
    */	
    ALTER PROCEDURE [dbo].[CT_CardType_Get]
        (
          @TargetValue1 INT ,
          @TargetValue2 INT
        )
    AS 
        BEGIN
            DECLARE @cdtsql NVARCHAR(4000)
            SET @cdtsql = ' in(' + CAST(@TargetValue1 AS NVARCHAR(50)) + ','
                + CAST(@TargetValue2 AS NVARCHAR(50)) + ')'
       
            
       
       
            EXECUTE(' SELECT  * from   dbo.Orders   where  ProductID ' + @cdtsql)
    	
    	
        END
    


    给我写信: QQ我:点击这里给我发消息

    2012年9月11日 16:01
  • Orders  表里的数据我是从adventureworks数据库里的SalesOrderDetail表数据导过来的

    pratice是我测试用的数据库


    给我写信: QQ我:点击这里给我发消息

    2012年9月11日 16:04
  • 大师,如果是“C#”传入参数,  string str  =  "310000Fa001,310000Fe001"  是不是就没有问题了???

    Science and technology is my lover.


    2012年9月12日 3:23
  • 大师,如果是“C#”传入参数,  string str  =  "310000Fa001,310000Fe001"  是不是就没有问题了???

    Science and technology is my lover.


    2012年9月12日 3:23
  • 你在 C# 中拼 T-SQL 可以,否则是一样的问题

    2012年9月12日 8:23
  • 使用表变量,将'310000Fa001','310000Fe001'插入表变量,然后IN (SELECT * FROM 表变量)
    2012年9月12日 13:46
  • 表变量,怎样用呢???

    Science and technology is my lover.

    2012年9月13日 1:27
  • 明白了  In 后面跟的是参数列表  “in(@A, @B)”这是不同的参数,“@A”和“@B”表示不同参数。而不能用一个“@A”表示所有的参数。

    Science and technology is my lover.

    2012年9月13日 2:54
  • 对的   

    给我写信: QQ我:点击这里给我发消息

    2012年9月13日 14:29
  • 这个不支持,如果你想这么用,只能整个语句都是拼接的,然后执行拼接好的sql。

    还有一个办法就是传入'111','123','234'这样的字符串,然后在sql中使用逗号分隔,把分隔的结果存入临时表,然后临时表和你的查询表join,然后BuildingNo相等作为条件。

    • 已编辑 shiwenbin 2012年9月14日 3:20 原来的回答有问题
    2012年9月14日 3:08
  • 参数列表的个数如果是固定的,可以这么用,如果是动态的,就不行了。
    2012年9月14日 3:21
  • BuildingNo    in     (@TargetValue)

    条件可改为

    ','+@TargetValue+','  like  +','+BuildingNo+','

    不用动态时可用

    SQL05可用XML传参

    SQL08可用表类型传参


    Roy Wu(吳熹Blog)(微博)

    2012年9月15日 13:28
    版主
  • 谢谢各位大师,不甚感激。

    exec  testone   @TargetValue='''310000Fa001'',''310000Fe001'''

    但是@TargetValue='''310000Fa001'',''310000Fe001'''这样才可以。     如果传入'310000Fa001,310000Fe001',是不行的。

    如果

    set    @TargetValue='310000Fa001,310000Fe001'

    SQL怎样处理,可以将其转化为'''310000Fa001'',''310000Fe001'''???

    也就是分别给'310000Fa001,310000Fe001'中每一个加两个 “ ” 号,应该怎样处理???


    Science and technology is my lover.

    2012年9月17日 6:57
  • 谢谢各位大师,谢谢。

    问题解决了,但小弟快让引号“ ' ” 搞晕了。

    运用背景:
       
      'in (' +@TargetValue+ ')' 

    直接执行存储过程传递参数:

      exec testone @TargetValue='''310000Fa001'',''310000Fe001'''

    存储过程内部转化:
        
      set @TargetValue = ''''+ REPLACE(@TargetValue,',',''',''')+''''


    晕了。。。

    Science and technology is my lover.

    2012年9月17日 8:28