有个字符超过varchar(4000),该如何处理。

飞猫0213 2013-11-18 02:12:12
比如我有个存储过程
create procedure pageQuery(
@ExeSQL varchar(4000) --传递过来的SQL语句,然后执行。这个只是举例
) as
begin
exec @ExeSQL
end

但是现在可能我传递的参数@ExeSQL,会超过该值,就会自动被截取了字符。执行肯定会出错。
所以我打算用 @ExeSQL ntext
但是后面 exec @ExeSQL 就出问题, EXECUTE <procname> 中,procname 只能是类型为 char、varchar、nchar 或 nvarchar 的文字或变量。
我应该怎么转换下。

我知道可能大家会说,SQL语句怎么会有那么长,这么长在性能上也有影响。这个我知道,但是我现在是必须要这么做,先不考虑性能问题。大家有什么办法啊!谢谢
...全文
1157 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
duangufei 2013-11-18
  • 打赏
  • 举报
回复
varchar(max) 或者text类型
名字委婉点 2013-11-18
  • 打赏
  • 举报
回复


create procedure pageQuery(
   @ExeSQL Nvarchar(max)  --传递过来的SQL语句,然后执行。这个只是举例
) as 
begin
     exec @ExeSQL
end
名字委婉点 2013-11-18
  • 打赏
  • 举报
回复
nvarchar(max)这意思?
發糞塗牆 2013-11-18
  • 打赏
  • 举报
回复
据我测试,join的方法比in的高很多倍
zbdzjx 2013-11-18
  • 打赏
  • 举报
回复
偷懒的办法,多定义几个参数,如10个参数,那就可以传入40000个字符了。 在存储过程内部,将这几个参数合并在一起执行。
飞猫0213 2013-11-18
  • 打赏
  • 举报
回复
感谢yupeigu,测试过,确实能执行超过4000以上的SQL语句。 我也知道这个很影响性能。不知道还有没有更好的方法?
飞猫0213 2013-11-18
  • 打赏
  • 举报
回复
能不能说的清楚点: select a.* from TABLE a LEFT join (1,2,3) b ON a.id=b.id WHERE b.id IS NOT null 如何得到b.id出来的。 还有选中的ID,也可能会上万个啊!当然上万是极端的选择。也有可能而已 用表值函数,也要在表里确定哪些是用户选中的ID啊。他不是选全部,如果全部,当然可以当作一个表关联来查询了。 就好像所有ID 在 表A(1,2,3,4) 其实用户只选择了。1,3,4 查询是,不就是这么写:select * from A where id in (1,3,4) 可是万一表更多ID,选中的也更多呢。这样语句就很长了!
LongRui888 2013-11-18
  • 打赏
  • 举报
回复
引用 7 楼 feimao784830900 的回复:
你的意思是,我选择ID时,首先插入在一个临时表。 然后在 join 表。这个插入也很花时间啊!
如果是sql server 2005及以后的版本,可以改成: varchar(max) 这个最多支持2G个字节,肯定能满足你的要求的
LongRui888 2013-11-18
  • 打赏
  • 举报
回复
引用 6 楼 feimao784830900 的回复:
比如某表是保存所有用户ID的,然后属于某个机构。 查询时候,可以选择机构,然后再选择机构下的某个用户。 如果用户选择基本全部用户。那么语句是这么写 select * from table where CustomeID in (选中的ID) --这里ID很多,然后就会越界 大家有没有特别好的方法处理啊! 因为这个原因,所以SQL 语句就会超过4000,甚至更大
改成varchar(8000)试试呢,会报错吗
發糞塗牆 2013-11-18
  • 打赏
  • 举报
回复
select a.* from TABLE a LEFT joni (选中的ID) b ON a.id=b.id WHERE b.id IS NOT null
飞猫0213 2013-11-18
  • 打赏
  • 举报
回复
你的意思是,我选择ID时,首先插入在一个临时表。 然后在 join 表。这个插入也很花时间啊!
飞猫0213 2013-11-18
  • 打赏
  • 举报
回复
比如某表是保存所有用户ID的,然后属于某个机构。 查询时候,可以选择机构,然后再选择机构下的某个用户。 如果用户选择基本全部用户。那么语句是这么写 select * from table where CustomeID in (选中的ID) --这里ID很多,然后就会越界 大家有没有特别好的方法处理啊! 因为这个原因,所以SQL 语句就会超过4000,甚至更大
發糞塗牆 2013-11-18
  • 打赏
  • 举报
回复
传字符串的话,我测过大概超过1000个id时,执行计划就无法生成,改成表变量就可以
發糞塗牆 2013-11-18
  • 打赏
  • 举报
回复
我以前公司的做法: 1、创建一个表值函数 2、用表值函数把1,2,3,4,...(这里多写些数字)转换成一个表 3、where那里in这个表值函数转换出来的表,或者直接在from中join
飞猫0213 2013-11-18
  • 打赏
  • 举报
回复
也可以这么理解吧,就传一个SQL语句过来,然后执行。但是这个语句比较长的。可以这么模拟: select 字段1,字段2,... from table where araeID in (1,2,3,4,...(这里多写些数字)) 那么这个语句就会吵过4000,甚至更多。 赋值给参数。然后执行。 我现在想怎么样才能传更多的字符给参数,然后能执行呢?
Ny-6000 2013-11-18
  • 打赏
  • 举报
回复
写多个sql参数,到存储过程里面再拼接起来. 不过sql里面定义的长度也是有限止的.
發糞塗牆 2013-11-18
  • 打赏
  • 举报
回复
参数存的是一系列类似ID的东西?

22,209

社区成员

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

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