SQL 存储过程 变量in操作符

qiaoqinqie 2011-03-31 02:23:25
我有一个存储过程 里面有一个游标 遍历记录插到另外一张表。 但是插入之前要验证其中一个字段在另外一个表存在。
之前在遍历的时候 都用if exist (select 表的另外一个字段)来做。
这样每次查询。感觉性能是个问题。
现在想把那个表的字段一次性查出来,放到一个()里面
然后用in 操作符去执行判断
写了一个存储过程取出表的所有字段 组装成()
存储过程如下

CREATE procedure [dbo].[usp_Get_Field_Set](
@FIELD VARCHAR(800),
@TABLE_NAME VARCHAR(800) ,
@FILED_SET VARCHAR(8000) OUTPUT
)
AS
BEGIN


DECLARE @TEMP_FIELD VARCHAR(800)
SET @FILED_SET = '('

DECLARE @SQL VARCHAR(8000)

SET @SQL = 'DECLARE QUERY_CURSOR CURSOR FOR
SELECT ' + @FIELD + ' FROM ' + @TABLE_NAME

EXEC(@SQL)


OPEN QUERY_CURSOR

FETCH NEXT FROM QUERY_CURSOR
INTO
@TEMP_FIELD

WHILE @@FETCH_STATUS = 0
BEGIN
SET @FILED_SET += CONVERT(VARCHAR(800),@TEMP_FIELD) + ','
FETCH NEXT FROM QUERY_CURSOR
INTO
@TEMP_FIELD
END
CLOSE QUERY_CURSOR
DEALLOCATE QUERY_CURSOR

SET @FILED_SET = SUBSTRING(@FILED_SET,1,LEN(@FILED_SET)-1) + ')'

END

现在呢,表的所有字段是可以完成了。 但是在存储过程的
in 操作符 好像执行不了


DECLARE @FIELD_SET VARCHAR(8000)
EXEC usp_Get_Field_Set 'OrderKey','dbo.TRU_WMS_ORDERS',@FIELD_SET OUTPUT
SELECT @FIELD_SET
这样可以出结果,比如(10 ,12 )


但是我在存储过程 用in 操作符
IF @ID IN FIELD_SET
就报错了。 请高人指点
...全文
99 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiaoqinqie 2011-04-02
  • 打赏
  • 举报
回复
呵呵 可以用 謝謝了啊 看來還是要多積累啊
[Quote=引用 5 楼 fuxiaoyang13 的回复:]

ALTER procedure [dbo].[usp_Get_Field_Set](
@FIELD VARCHAR(800),
@TABLE_NAME VARCHAR(800) ,
@FILED_SET VARCHAR(8000) OUTPUT
)
AS
BEGIN


DECLARE @TEMP_FIELD VARCHAR(800)
SET ……
[/Quote]
fuxiaoyang13 2011-04-01
  • 打赏
  • 举报
回复
ALTER procedure [dbo].[usp_Get_Field_Set](
@FIELD VARCHAR(800),
@TABLE_NAME VARCHAR(800) ,
@FILED_SET VARCHAR(8000) OUTPUT
)
AS
BEGIN


DECLARE @TEMP_FIELD VARCHAR(800)
SET @FILED_SET = '('

DECLARE @SQL VARCHAR(8000)

SET @SQL = 'DECLARE QUERY_CURSOR CURSOR FOR
SELECT ' + @FIELD + ' FROM ' + @TABLE_NAME

EXEC(@SQL)


OPEN QUERY_CURSOR

FETCH NEXT FROM QUERY_CURSOR
INTO @TEMP_FIELD

WHILE @@FETCH_STATUS = 0
BEGIN
SET @FILED_SET =@FILED_SET+ ''''+CONVERT(VARCHAR(800),@TEMP_FIELD)+'''' + ','
FETCH NEXT FROM QUERY_CURSOR
INTO @TEMP_FIELD
END
CLOSE QUERY_CURSOR
DEALLOCATE QUERY_CURSOR

SET @FILED_SET = SUBSTRING(@FILED_SET,1,LEN(@FILED_SET)-1) + ')'

/*
declare @percent varchar(8000),@xbmbh varchar(10),@sql varchar(8000)
EXECUTE usp_Get_Field_Set 'bmbh','hr_department', @FILED_SET = @percent OUTPUT
select @percent
set @xbmbh='N0'

set @sql='SELECT (CASE WHEN '+''''+@xbmbh+''''+ ' in '+@percent+' then 1 else 0 end)'
exec(@sql)

*/
--select @FILED_SET

END
用动态语句可以调用,你试试
fanzhouqi 2011-03-31
  • 打赏
  • 举报
回复
lz 完全可以 使用 表变量 或者临时表 来带你 in(xxx)
--小F-- 2011-03-31
  • 打赏
  • 举报
回复
直接ID IN 显然有问题
qiaoqinqie 2011-03-31
  • 打赏
  • 举报
回复
2000

[Quote=引用 1 楼 fanzhouqi 的回复:]

lz 用什么版本的sql?
[/Quote]
fanzhouqi 2011-03-31
  • 打赏
  • 举报
回复
lz 用什么版本的sql?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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