200分请教SQL中in参数在存储过程中的传递问题?

zhiang75 2007-05-31 11:27:11
比如有一个SQL

SELECT * FROM SELTEXT WHERE ID IN (1,2,3,4)

我希望创建一个存储过程
比如:
CREATE PROCEDURE [INSelect]
@P_0 NVARCHAR(600)
AS
SELECT * FROM SELTEXT WHERE ID IN (@P_0)

创建此存储过程没有问题,执行时总是有错误,
请教是什么问题,解决问题200分相送,另不打算使用临时表,有没有其他办法。
另:
SELECT * FROM SELTEXT WHERE ID IN (1,2,3,4) 中 1,2,3,4是变量,可以是任意值。。。

我把此贴设为200分只是想探讨一下学术上的事情,就是IN是否可以使用参数的问题,因为这个问题一直困扰我,并没有一个明确的答案,通过EXEC只是表面解决了问题,但是还是没有给我一个根本的概念,我并没有程序上无法解决的问题需要大家帮助,谢谢大家的帮助。

...全文
1686 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamwen 2009-09-10
  • 打赏
  • 举报
回复
最好是用 EXEC了
神奇的章鱼哥 2007-06-02
  • 打赏
  • 举报
回复
我做过,也行得通,就是参数有8000个字符的限制,似乎有点遗憾,虽然知道实际上是不可能超过8000个字符的
fwacky 2007-06-01
  • 打赏
  • 举报
回复
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'INSelect2' AND TYPE = 'P')
DROP PROCEDURE INSelect2

GO
CREATE PROCEDURE [INSelect2]
@P_0 NVARCHAR(600)
AS
DECLARE @sql varchar(100)
set @sql = ','+@P_0+','

SELECT * FROM AAA WHERE charindex( ','+cast(SL as varchar)+',',@sql) > 0




EXECUTE INSELECT2 @P_0 = '60,10,20'
nancun 2007-06-01
  • 打赏
  • 举报
回复
乱码1/2
hy_lihuan 2007-06-01
  • 打赏
  • 举报
回复
字符串处理问题
J_S_S 2007-06-01
  • 打赏
  • 举报
回复
mark
zxkid 2007-06-01
  • 打赏
  • 举报
回复
不想用EXEC。。。
====
你若一定不想用exec sp_ExecuteSql的话可以将建一个表变量或临时表, IN字符串拆分后放进去
再SELECT * FROM SELTEXT WHERE ID IN (select id from @table)
不就行了
IT_zen 2007-06-01
  • 打赏
  • 举报
回复
鍥炵瓟涓枃灏变贡鐮
IT_zen 2007-06-01
  • 打赏
  • 举报
回复
declare @sql nvarchar(4000)
@sql = 'SELECT * FROM SELTEXT WHERE ID IN ('+@P_0+')'
exec @sql
marvelstack 2007-06-01
  • 打赏
  • 举报
回复
值多了看上去不是很好,不过要实现参数化。

1。通过参数化查询,不写存储过程。有多少的值设置多少的SqlParameter对象,进行赋值组合添加到SqlCommand对象中,最后组合成查询语句。赋值的过程可以通过循环实现赋值。

2。使用sp_executesql,这个楼上的已经说了。
kingtiy 2007-05-31
  • 打赏
  • 举报
回复
@P_0 NVARCHAR(600)
这个东西是个集合就可以了
amandag 2007-05-31
  • 打赏
  • 举报
回复
sp_executesql

这个问题论坛上已经有人问过多次了
lizhizhe2000 2007-05-31
  • 打赏
  • 举报
回复
一、使用 sp_executesql 系统存储过程执行 Unicode 字符串
  1、直接组合 SQL 语句执行
  CREATE PROCEDURE p_Test1
  @TableName varchar(20)
  AS
  declare @SQLString nvarchar(200)
  set @SQLString = N'select * from ' + @TableName
  EXECUTE sp_executesql @SQLString
  2、SQL 语句里包含嵌入参数
  CREATE PROCEDURE p_Test2
  @TableName varchar(20),
  @UserID int,
  @UserName varchar(50)
  AS
  declare @SQLString nvarchar(200)
  
  set @SQLString = N'select * from ' +
  @TableName +
  N' where UserID=@UserID or UserName=@UserName'
  
  EXECUTE sp_executesql @SQLString,
  N'@UserID int, @UserName varchar(50)',
  @UserID, @UserName
  
  这也是 Microsoft SQL Server 的推荐做法。
  
  二、使用EXECUTE语句执行字符串
  CREATE PROCEDURE p_Test3
  @TableName varchar(20)
  AS
  declare @SQLString nvarchar(200)
  set @SQLString = N'select * from ' + @TableName
  EXEC(@SQLString)
zhiang75 2007-05-31
  • 打赏
  • 举报
回复
TO:lizhizhe2000(武安侯)
不想用EXEC。。。
jinjazz 2007-05-31
  • 打赏
  • 举报
回复
@P_0是只有一个字符元素的集合,所以会类型不匹配
zhiang75 2007-05-31
  • 打赏
  • 举报
回复
to:cancerser(都是混饭吃,记得要结帖)
要是知道确切的数量就好了。。。比如建个OR
如where ID=@P_0 OR ID=@P_1 OR ID=@P_2 也成。。。呵呵,问题是不知道确切的数量啊。。
lizhizhe2000 2007-05-31
  • 打赏
  • 举报
回复
另处MSDN有关于 sp_ExecuteSql 的详细用法!
lizhizhe2000 2007-05-31
  • 打赏
  • 举报
回复
例:
CREATE PROCEDURE dbo.Update_Data
@sqltxt varchar(4000) --//需要执行的更新sql语句
AS
declare @sql nvarchar(4000)
set @sql = @sqltxt
exec sp_ExecuteSql @sql --//其中sp_ExecuteSql 是系统自带的存储过程
lizhizhe2000 2007-05-31
  • 打赏
  • 举报
回复
可在存储过程中拼接字符串,然后执行此字符串,类似于js中的eval
PROCEDURE [dbo].[INSelect]
@P_0 NVARCHAR(600)
AS
DECLARE @A VARCHAR(6000)
SET @A='SELECT * FROM testTb WHERE zip IN ('+@P_0+')'
然后用系统存储过程sp_executesql执行@A即可!
zhiang75 2007-05-31
  • 打赏
  • 举报
回复
to:lizhizhe2000(武安侯)
如用简单的办法建一个集合对象啊?
加载更多回复(9)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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