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

时间:2021-01-02 13:22:37
比如我有个存储过程
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语句怎么会有那么长,这么长在性能上也有影响。这个我知道,但是我现在是必须要这么做,先不考虑性能问题。大家有什么办法啊!谢谢

17 个解决方案

#1


参数存的是一系列类似ID的东西?

#2


写多个sql参数,到存储过程里面再拼接起来.

不过sql里面定义的长度也是有限止的.

#3


也可以这么理解吧,就传一个SQL语句过来,然后执行。但是这个语句比较长的。可以这么模拟:
select 字段1,字段2,... from table where araeID in (1,2,3,4,...(这里多写些数字))
那么这个语句就会吵过4000,甚至更多。
赋值给参数。然后执行。
我现在想怎么样才能传更多的字符给参数,然后能执行呢? 

#4


我以前公司的做法:
1、创建一个表值函数
2、用表值函数把1,2,3,4,...(这里多写些数字)转换成一个表
3、where那里in这个表值函数转换出来的表,或者直接在from中join

#5


传字符串的话,我测过大概超过1000个id时,执行计划就无法生成,改成表变量就可以

#6


比如某表是保存所有用户ID的,然后属于某个机构。
查询时候,可以选择机构,然后再选择机构下的某个用户。
如果用户选择基本全部用户。那么语句是这么写
select * from table where CustomeID in (选中的ID)  --这里ID很多,然后就会越界
大家有没有特别好的方法处理啊!

因为这个原因,所以SQL 语句就会超过4000,甚至更大

#7


你的意思是,我选择ID时,首先插入在一个临时表。
然后在 join 表。这个插入也很花时间啊!

#8



select a.* from TABLE a LEFT joni (选中的ID) b ON a.id=b.id
WHERE b.id IS NOT null

#9


引用 6 楼 feimao784830900 的回复:
比如某表是保存所有用户ID的,然后属于某个机构。
查询时候,可以选择机构,然后再选择机构下的某个用户。
如果用户选择基本全部用户。那么语句是这么写
select * from table where CustomeID in (选中的ID)  --这里ID很多,然后就会越界
大家有没有特别好的方法处理啊!

因为这个原因,所以SQL 语句就会超过4000,甚至更大


改成varchar(8000)试试呢,会报错吗

#10


引用 7 楼 feimao784830900 的回复:
你的意思是,我选择ID时,首先插入在一个临时表。
然后在 join 表。这个插入也很花时间啊!


如果是sql server 2005及以后的版本,可以改成:

varchar(max) 这个最多支持2G个字节,肯定能满足你的要求的

#11


能不能说的清楚点:
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,选中的也更多呢。这样语句就很长了!

#12


感谢yupeigu,测试过,确实能执行超过4000以上的SQL语句。
我也知道这个很影响性能。不知道还有没有更好的方法?

#13


偷懒的办法,多定义几个参数,如10个参数,那就可以传入40000个字符了。
在存储过程内部,将这几个参数合并在一起执行。

#14


据我测试,join的方法比in的高很多倍

#15


nvarchar(max)这意思?

#16




create procedure pageQuery(
   @ExeSQL Nvarchar(max)  --传递过来的SQL语句,然后执行。这个只是举例
) as 
begin
     exec @ExeSQL
end

#17


varchar(max) 或者text类型

#1


参数存的是一系列类似ID的东西?

#2


写多个sql参数,到存储过程里面再拼接起来.

不过sql里面定义的长度也是有限止的.

#3


也可以这么理解吧,就传一个SQL语句过来,然后执行。但是这个语句比较长的。可以这么模拟:
select 字段1,字段2,... from table where araeID in (1,2,3,4,...(这里多写些数字))
那么这个语句就会吵过4000,甚至更多。
赋值给参数。然后执行。
我现在想怎么样才能传更多的字符给参数,然后能执行呢? 

#4


我以前公司的做法:
1、创建一个表值函数
2、用表值函数把1,2,3,4,...(这里多写些数字)转换成一个表
3、where那里in这个表值函数转换出来的表,或者直接在from中join

#5


传字符串的话,我测过大概超过1000个id时,执行计划就无法生成,改成表变量就可以

#6


比如某表是保存所有用户ID的,然后属于某个机构。
查询时候,可以选择机构,然后再选择机构下的某个用户。
如果用户选择基本全部用户。那么语句是这么写
select * from table where CustomeID in (选中的ID)  --这里ID很多,然后就会越界
大家有没有特别好的方法处理啊!

因为这个原因,所以SQL 语句就会超过4000,甚至更大

#7


你的意思是,我选择ID时,首先插入在一个临时表。
然后在 join 表。这个插入也很花时间啊!

#8



select a.* from TABLE a LEFT joni (选中的ID) b ON a.id=b.id
WHERE b.id IS NOT null

#9


引用 6 楼 feimao784830900 的回复:
比如某表是保存所有用户ID的,然后属于某个机构。
查询时候,可以选择机构,然后再选择机构下的某个用户。
如果用户选择基本全部用户。那么语句是这么写
select * from table where CustomeID in (选中的ID)  --这里ID很多,然后就会越界
大家有没有特别好的方法处理啊!

因为这个原因,所以SQL 语句就会超过4000,甚至更大


改成varchar(8000)试试呢,会报错吗

#10


引用 7 楼 feimao784830900 的回复:
你的意思是,我选择ID时,首先插入在一个临时表。
然后在 join 表。这个插入也很花时间啊!


如果是sql server 2005及以后的版本,可以改成:

varchar(max) 这个最多支持2G个字节,肯定能满足你的要求的

#11


能不能说的清楚点:
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,选中的也更多呢。这样语句就很长了!

#12


感谢yupeigu,测试过,确实能执行超过4000以上的SQL语句。
我也知道这个很影响性能。不知道还有没有更好的方法?

#13


偷懒的办法,多定义几个参数,如10个参数,那就可以传入40000个字符了。
在存储过程内部,将这几个参数合并在一起执行。

#14


据我测试,join的方法比in的高很多倍

#15


nvarchar(max)这意思?

#16




create procedure pageQuery(
   @ExeSQL Nvarchar(max)  --传递过来的SQL语句,然后执行。这个只是举例
) as 
begin
     exec @ExeSQL
end

#17


varchar(max) 或者text类型