SET @SectorID = '1,2';SELECT * FROM TBL WHERE pkID IN (@SectorID)

wtoeb 2009-06-15 12:46:19

DECLARE @SectorID NVARCHAR(255);
SET @SectorID = '1,2';
SELECT * FROM TBL WHERE pkID IN (@SectorID);


为什么这样会出错?提示:
将 nvarchar 值 '1,2' 转换为数据类型为 int 的列时发生语法错误。
应该如何解决?谢谢。
...全文
108 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
dj3688 2009-06-15
  • 打赏
  • 举报
回复
顶,树人真快~~
jiangshun 2009-06-15
  • 打赏
  • 举报
回复
DECLARE @SectorID NVARCHAR(255)
SET @SectorID = '1,2'
declare @s varchar(4000)
set @s=''
set @s='SELECT * FROM TBL WHERE pkID IN ('+@SectorID+')'
exec(@s)
百年树人 2009-06-15
  • 打赏
  • 举报
回复
--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
devilidea 2009-06-15
  • 打赏
  • 举报
回复
学习
winstonbonaparte 2009-06-15
  • 打赏
  • 举报
回复
要是发生这种语法错误的时候,你可以先把SQL语句print一下看下是哪里出了,这样才能印象更深刻
feixianxxx 2009-06-15
  • 打赏
  • 举报
回复
我得慢慢看来
zhangle861010 2009-06-15
  • 打赏
  • 举报
回复


DECLARE @SectorID INT
SET @SectorID = 1
declare @s varchar(4000)
set @s=''
set @s='SELECT * FROM TBL WHERE pkID IN
(
CASE WHEN ' + LTRIM(@SectorID) + ' IS NOT NULL THEN
' + LTRIM(@SectorID) + '
ELSE
0
END
)'
exec(@s)
--小F-- 2009-06-15
  • 打赏
  • 举报
回复
学习
wtoeb 2009-06-15
  • 打赏
  • 举报
回复
不好意思,还是有问题的,如下:

DECLARE @SectorID INT
SET @SectorID = 1
declare @s varchar(4000)
set @s=''
set @s='SELECT * FROM TBL WHERE pkID IN
(
CASE WHEN ' + LTRIM(@SectorID) + ' IS NOT NULL THEN
' + LTRIM(@SectorID) + '
ELSE
0
END
)
exec(@s)

提示:第 9 行: ',' 附近有语法错误。
drysea 2009-06-15
  • 打赏
  • 举报
回复

SELECT * FROM TBL WHERE pkID IN (@SectorID);
--写成:
exec ('SELECT * FROM TBL WHERE pkID IN ('+@SectorID+')')
--拼接一下就好了
--btw,没有标红标蓝了,感觉好奇怪啊,sql语句
  • 打赏
  • 举报
回复
--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
jiangzehong 2009-06-15
  • 打赏
  • 举报
回复
up
百年树人 2009-06-15
  • 打赏
  • 举报
回复
DECLARE @SectorID INT 
SET @SectorID = 1
declare @s varchar(4000)
set @s=''
set @s='SELECT * FROM TBL WHERE pkID = '+ltrim(@SectorID)+''
exec(@s)
wtoeb 2009-06-15
  • 打赏
  • 举报
回复
谢谢树人和 jiangshun 如果是 int 时怎么办?
DECLARE @SectorID INT
SET @SectorID = 1
declare @s varchar(4000)
set @s=''
set @s='SELECT * FROM TBL WHERE pkID = '+@SectorID+''
exec(@s)

这时会出错。
将 varchar 值 'SELECT * FROM TBL WHERE pkID = ' 转换为数据类型为 int 的列时发生语法错误。
ai_li7758521 2009-06-15
  • 打赏
  • 举报
回复
DECLARE @SectorID NVARCHAR(255);
SET @SectorID = '1,2';
SELECT * FROM TBL WHERE CHARINDEX(','+pkID+',',','+@SectorID+',')>0;

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧