前面省略
print @OutStockNo
select OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty into #temp
from Wms_viewUnionPicking
where OutStockNo in (@OutStockNo)
select * from #tempprint @outStockNo 的值是
'Out0809180201','Out0809200099','Out0809200101'
请问,哪个地方写错了?
直接把值放进去是有记录的。
解决方案 »
- 在关键字 'IN' 附近有语法错误。
- 企业管理器打开时,提示ssl error 错误,百分求答案
- sqlserver我卸载后,重新安排不了
- (高手看看)字段多的表、字段少的表相比较问题?
- 请问SQL里的发布、分发、订阅的服务器怎么设置?
- 无法向acces中插入数据,日期字段问题
- 冰天雪地裸跪在线急等....
- 游标的问题
- 请问高手怎样将domino中的数据转移到sqlser2000中?谢谢
- 数据的自动导入!
- 请问,在存储过程中Create table #temp 和直接 select * into #temp 产生的#temp有区别吗?
- 这句sql怎么写?(table (a char(10),id int) 我现在想替换字段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
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
我不想使用@sql这种,因为传入的单号会有很多,会超过8000字符。
select OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty into #temp
from Wms_viewUnionPicking
where OutStockNo in ('Out0809180201','Out0809200099','Out0809200101' )
这样是有记录的。
既然print @outstockno 出来的是 'Out0809180201','Out0809200099','Out0809200101'
为何直接放 in (@outstockno) 不可以呢?
select OutStockBLNo,CustomerCargo,warehousename,StackCode,PlanOutQty into #temp
from Wms_viewUnionPicking
where OutStockNo in (select OutStockNo from #T)
--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
declare @i varchar(40)
set @i = '''Out0809180201'',''Out0809200099'''
exec('select * from wmsoutstockmaster where outstockno in ('+@i+')')
是可行的。
那意思就是碰到这种情况看来只能用exec的方法了,是么?
--查询的值列表
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
@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+')')
是有值的,这是怎么回事呢?