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里面定义的长度也是有限止的.
不过sql里面定义的长度也是有限止的.
#3
也可以这么理解吧,就传一个SQL语句过来,然后执行。但是这个语句比较长的。可以这么模拟:
select 字段1,字段2,... from table where araeID in (1,2,3,4,...(这里多写些数字))
那么这个语句就会吵过4000,甚至更多。
赋值给参数。然后执行。
我现在想怎么样才能传更多的字符给参数,然后能执行呢?
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
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,甚至更大
查询时候,可以选择机构,然后再选择机构下的某个用户。
如果用户选择基本全部用户。那么语句是这么写
select * from table where CustomeID in (选中的ID) --这里ID很多,然后就会越界
大家有没有特别好的方法处理啊!
因为这个原因,所以SQL 语句就会超过4000,甚至更大
#7
你的意思是,我选择ID时,首先插入在一个临时表。
然后在 join 表。这个插入也很花时间啊!
然后在 join 表。这个插入也很花时间啊!
#8
select a.* from TABLE a LEFT joni (选中的ID) b ON a.id=b.id
WHERE b.id IS NOT null
#9
改成varchar(8000)试试呢,会报错吗
#10
如果是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,选中的也更多呢。这样语句就很长了!
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里面定义的长度也是有限止的.
不过sql里面定义的长度也是有限止的.
#3
也可以这么理解吧,就传一个SQL语句过来,然后执行。但是这个语句比较长的。可以这么模拟:
select 字段1,字段2,... from table where araeID in (1,2,3,4,...(这里多写些数字))
那么这个语句就会吵过4000,甚至更多。
赋值给参数。然后执行。
我现在想怎么样才能传更多的字符给参数,然后能执行呢?
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
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,甚至更大
查询时候,可以选择机构,然后再选择机构下的某个用户。
如果用户选择基本全部用户。那么语句是这么写
select * from table where CustomeID in (选中的ID) --这里ID很多,然后就会越界
大家有没有特别好的方法处理啊!
因为这个原因,所以SQL 语句就会超过4000,甚至更大
#7
你的意思是,我选择ID时,首先插入在一个临时表。
然后在 join 表。这个插入也很花时间啊!
然后在 join 表。这个插入也很花时间啊!
#8
select a.* from TABLE a LEFT joni (选中的ID) b ON a.id=b.id
WHERE b.id IS NOT null
#9
改成varchar(8000)试试呢,会报错吗
#10
如果是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,选中的也更多呢。这样语句就很长了!
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类型