--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
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
解决方案 »
- 求一条SQL语句
- sqlserver2008的库如何导入到sqlserver2005中?
- 问一句麻烦的插入SQL
- 怎样修改外键设置?【MS SQL Server 2005】
- 求助:如何使编码变得规范
- 怎么写这个sql语句??
- 我用dotnet程序,访问远程sqlServer,非常慢,一个普通的一条数据的提交也要1分多钟
- 3个基本问题,实在不好意思,请不吝赐教——每题20分。
- 如何实现通过DOS系统对SQL SERVER数据库进行数据表读写,在多台机器同事读写时候又不会成产生冲突
- (急急急---第二次贴)高手请进==>我用VB设计的程序连接SQL SERVER2000只要有几台工作站同时访问就会有经常连接不上的问题,但一台连接是肯定没问题的,请问何原因?不断加分...
- 我的数据库是SQL2000怎么远程连接空间供应商的数据库这么慢,无法操作
- 十万火急求答案:怎么才能使sql语句优化,sql中的@符号有什么用
declare @s varchar(200)
set @s='''1'',''2'''
exec('select name from t where id IN ('+@ID_LIST+')')
declare @ID_LIST varchar(200)
set @ID_LIST='''1'',''2'''
select name from student where charindex(''''+cast(id as varchar)+'''',@ID_LIST)>0
declare @ID_LIST varchar(200)
set @ID_LIST='''1'',''2'''
exec('select name from student where id IN ('+@ID_LIST+')')--效率低的:
declare @ID_LIST varchar(200)
set @ID_LIST='''1'',''2'''
select name from student where charindex(''''+cast(id as varchar)+'''',@ID_LIST)>0
CREATE PROC CHECK_IS_RIGHT
(
@ID_LIST varchar(200)
)
AS
SET NOCOUNT ON
BEGIN
SELECT count(*) AS CC
FROM RPT_ALL
where ID IN (@ID_LIST)
END--------调用------------
declare @ID_LIST varchar(200)
set @ID_LIST='''AA'',''BB'''
exec CHECK_IS_RIGHT @ID_LIST如果只有一个值,例如set @ID_LIST='AA'则正常.究竟应该怎样写呢?麻烦各位了,再次谢谢各位!
(
@ID_LIST varchar(200)
)
AS
SET NOCOUNT ON
BEGIN
exec ('SELECT count(*) AS CC
FROM tb
where 品名 IN ('+@ID_LIST+')')
END
go
declare @ID_LIST varchar(200)
set @ID_LIST='''A'',''B'''
exec CHECK_IS_RIGHT @ID_LIST
/*
CC
-----------
2*/
select * from tb
/*
id 品名 出库数
----------- ---- -----------
1 a 100
2 a 70
3 c 60
4 d 60
5 e 60(所影响的行数为 5 行)*/
drop proc CHECK_IS_RIGHT