一个使用动态sql的问题(100分)

  • 主题发起人 主题发起人 zhjwjan
  • 开始时间 开始时间
Z

zhjwjan

Unregistered / Unconfirmed
GUEST, unregistred user!
我在sql server中写存储过程时,很多时候会使用动态sql。在使用到字符串字段时,如果对应
的字符串变量中含有单引号时,就会导致执行sql出错。例如:
exec ( 'insert into '+@table+' (name) values ('''+@name+''')' )
@table和@name是存储过程的参数,如果@name里含有单引号,那么执行这个sql语句一定出错。
我开始时想对每个字符串变量操作前都检查是否含有单引号,有就用2个单引号去替换。
但这样不可行,因为太多动态sql,太多字符串字段了。
请问应该怎样做才能解决这个问题?
 
exec 储存过程名称
在储存过程中直接调用 insert into @table (name) values @name
 
不可行,每个动态sql的形式都不同的,我没理由为每一个动态sql都建一个存储过程的。
请大家给个行得通的方法。谢谢!
 
你可以在Delphi中写一个函数,在调用存储过程前,就对参数使用这个函数,
将1个单引号变为两个
 
to gongshl:我觉得这样也不怎么好,如果存储过程多,且字符串参数很多的话,每次都要调用
很麻烦。对于不是从程序传入的参数,这个办法起不了作用。
 
可以建立一个共用的
Execute ('@SQL')
@SQL是从前台传送的参数
 
to wenhong:能说详细点吗?
 
在Sql Server 中写存储过程格式如下:
Execute (@SQL)

在前台直接传送参数
SQL='insert into '+@table+' (name) values ('''+@name+''')'
Parameters.ParamByName('@SQL').Value:=SQL
这样一来只要你在DELPHI的字符串合格,那么到后台也照样可以运行
如果不行你认为,能否举出详细的例子
 
to wenhong:
我想知道你的execute存储过程里是怎样执行的,是不是直接exec @sql?如果是这样的话
同样会出错。@name=abc'ckvj就可以令它出错了。
 
多人接受答案了。
 
后退
顶部