• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

sql存储过程in参数如何传递及问题解决

mysql 搞代码 4年前 (2022-01-09) 63次浏览 已收录 0个评论

下面来介绍在sql存储过程in参数如何传递及问题解决,有需要的朋友可参考参考。

–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’

–由于是字段类型是,所本文来源gaodaimacom搞#^代%!码&网*以在拼接时,必须为其加上字符串边界符(‘)
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 Server Management Studio里执行这个(我使用的是SQL Server 2005如果是SQL 2000这个函数要改些内容如:VARCHAR(MAX)),会生成一个表值函数,然后使用时呢,比如你想实现:In(@ids)这时可以换成 In(select * from Split(@ids , ‘,’))

这个函数的作用呢,就是把你输入的字符按一定的分隔符分开,并放在一个表里的一列里,然后返回。

代码如下复制代码

–引用 Select * From Split(‘1,2,3’ , ‘,’)
–引用 Select * From Split(‘我,是,www.111cn.net’ , ‘,’)
CREATE FUNCTION [dbo].[Split]
(
@c VARCHAR(MAX) ,
@split VARCHAR(50)
)
RETURNS @t TABLE ( col VARCHAR(50) )
AS
BEGIN
WHILE ( CHARINDEX(@split, @c) 0 )
BEGIN
INSERT @t( col )
VALUES ( SUBSTRING(@c, 1, CHARINDEX(@split, @c) – 1) )
SET @c = STUFF(@c, 1, CHARINDEX(@split, @c), ”)
END
INSERT @t( col ) VALUES ( @c )
RETURN
END


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:sql存储过程in参数如何传递及问题解决

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址