前面省略
print @OutStockNo
select OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty into #temp
from Wms_viewUnionPicking
where OutStockNo in (@OutStockNo)
select * from #tempprint @outStockNo 的值是
'Out0809180201','Out0809200099','Out0809200101'
请问,哪个地方写错了?
直接把值放进去是有记录的。

解决方案 »

  1.   

    --1. 构造使用IN子句的动态Transact-SQL方法进行编号查询--a. 要查询的字段类型是数字型--查询的值列表
    DECLARE @idlist varchar(100)
    SET @idlist='1,2,3'--拼接并执行动态Transact-SQL语句
    EXEC('SELECT * FROM tbname WHERE fdname IN('+@idlist+')')
    GO--b. 要查询的字段类型是字符型
    --查询的值列表已经加上了字符串边界符
    DECLARE @idlist varchar(100)
    SET @idlist='''a'',''b''''a'',''c'''--拼接并执行动态Transact-SQL语句
    EXEC('SELECT * FROM tbname WHERE fdname IN('+@idlist+')')
    GO--查询的值列表没有字符串边界符
    DECLARE @idlist varchar(100)
    SET @idlist='a,b''a,c'--由于是字段类型是,所以在拼接时,必须为其加上字符串边界符(')
    DECLARE @s varchar(1000)
    SET @s=''''
    +REPLACE(REPLACE(@idlist,'''',''''''),',',''',''')
    +''''--拼接并执行动态Transact-SQL语句
    EXEC('SELECT * FROM tbname WHERE fdname IN('+@s+')')
    GO/*=====================================================*/
    --2. 使用LIKE或者PATINDEX进行编号查询
    --查询的值列表
    DECLARE @idlist varchar(100)
    SET @idlist='1,2,3'--查询
    SELECT * FROM tbname WHERE CHARINDEX(','+RTRIM(fdname)+',',','+@idlist+',')>0
    SELECT * FROM tbname WHERE PATINDEX('%,'+RTRIM(fdname)+',%',','+@idlist+',')>0
    SELECT * FROM tbname WHERE ','+@idlist+',' LIKE '%,'+RTRIM(fdname)+',%'
    GO/*=====================================================*/
    --3. 编号查询中常见的错误
    --a. 最容易犯的错误:表达式充当表达式列表。
    DECLARE @s varchar(100)
    SET @s='1'
    SELECT id,name FROM sysobjects WHERE id IN(@s)
    /*--结果
    id          name 
    ---------------- ------------
    1           sysobjects
    --*/SET @s='1,2,3'
    SELECT id,name FROM sysobjects WHERE id IN(@s)
    /*--结果
    服务器: 消息 245,级别 16,状态 1,行 3
    将 varchar 值 '1,2,3' 转换为数据类型为 int 的列时发生语法错误。
    --*/
    GO--b. 生成动态Transact-SQL语句时忽略了数据类型。
    DECLARE @s varchar(100)
    SET @s='U,S'
    EXEC('SELECT id,name FROM sysobjects WHERE id IN('+@s+')')
    /*--结果:
    服务器: 消息 207,级别 16,状态 3,行 1
    列名 'S' 无效。
    服务器: 消息 207,级别 16,状态 1,行 1
    列名 'U' 无效。
    --*/
    GO--c. 忽略了比较的精确性问题。
    --要查询的数据
    DECLARE @t TABLE(col varchar(10))
    INSERT @t SELECT '1'
    UNION ALL SELECT '11'
    UNION ALL SELECT '111'
    UNION ALL SELECT '22'--查询
    DECLARE @s varchar(100)
    SET @s='111,22'
    SELECT * FROM @t WHERE CHARINDEX(col,@s)>0
    /*--结果
    col        
    ---------- 
    1
    11
    111
    22
    -*/
    GO
      

  2.   

    因为@outstockno是一个字符串,而不是字符串列表
    declare @sql varchar(1000)
    set @sql='select OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty into #temp
    from Wms_viewUnionPicking
    where OutStockNo in ('+@OutStockNo+')'
    exec(@sql)
    不知道#temp是不是算顶级的过程中的,如果不是就用##temp
      

  3.   


    我不想使用@sql这种,因为传入的单号会有很多,会超过8000字符。
      

  4.   

    可是我直接把
    select OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty into #temp
    from Wms_viewUnionPicking
    where OutStockNo in ('Out0809180201','Out0809200099','Out0809200101' )
    这样是有记录的。
    既然print @outstockno 出来的是 'Out0809180201','Out0809200099','Out0809200101' 
    为何直接放 in (@outstockno) 不可以呢?
      

  5.   

    既然如此,把@outstockno拆开放到一个临时表#T里。然后:
    select OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty into #temp
    from Wms_viewUnionPicking
    where OutStockNo in (select OutStockNo from #T)
      

  6.   

    --3. 编号查询中常见的错误
    --a. 最容易犯的错误:表达式充当表达式列表。--b. 生成动态Transact-SQL语句时忽略了数据类型。
    DECLARE @s varchar(100)
    SET @s='U,S'
    EXEC('SELECT id,name FROM sysobjects WHERE id IN('+@s+')')
    /*--结果:
    服务器: 消息 207,级别 16,状态 3,行 1
    列名 'S' 无效。
    服务器: 消息 207,级别 16,状态 1,行 1
    列名 'U' 无效。
    --*/
    GO
      

  7.   

    我这样改了下
    declare @i varchar(40)
    set @i = '''Out0809180201'',''Out0809200099'''
    exec('select * from wmsoutstockmaster where outstockno in ('+@i+')')
    是可行的。
    那意思就是碰到这种情况看来只能用exec的方法了,是么?
      

  8.   

    还可以用这样啊...--2. 使用LIKE或者PATINDEX进行编号查询
    --查询的值列表
    DECLARE @idlist varchar(100)
    SET @idlist='1,2,3'--查询
    SELECT * FROM tbname WHERE CHARINDEX(','+RTRIM(fdname)+',',','+@idlist+',')>0
    SELECT * FROM tbname WHERE PATINDEX('%,'+RTRIM(fdname)+',%',','+@idlist+',')>0
    SELECT * FROM tbname WHERE ','+@idlist+',' LIKE '%,'+RTRIM(fdname)+',%'
    GO
      

  9.   

    exec Wms_procUnionByBLNo 'Out0809180201','1=1 'ALTER    proc [dbo].[Wms_procUnionByBLNo]
    @OutStockNo varchar(8000),
    @OwnerID varchar(1000) = 'OwnerID in (''U00001'')'
    as
    set @OutStockNo = replace(@OutStockNo,',',''''',''''')
    set @outStockNO = '''''''' +@outstockno +''''''''create table #temp
    (
    OutStockBLNo varchar(40),
    CustomerCargo varchar(100),
    warehousename varchar(20),
    StackCode varchar(20),
    PlanOutQty numeric(20,4)
    )
    print @OutStockNo
    insert into #temp (OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty)
    exec('select OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty from Wms_viewUnionPicking 
    where outstockno in ( '+@outstockno+')')
    这样还是没有任何记录,print出的值是'''Out0809180201'''
    而我直接这样写
    declare @i varchar(8000)
    set @i = '''Out0809180201'''
    exec('select * from wmsoutstockmaster where outstockno in ('+@i+')')
    是有值的,这是怎么回事呢?