最近写
procedure
,遇到一些问题。其中我觉得关于“用变量名作为表名”的问题较有价值,写出和大家一起分享。请各位若有好的解决方案一定要不吝赐教。
如果你在写
procedure
时要根据特定变量的值动态创建
table
(表名是全部或部分特定变量的值)。例如:
declare @tablename
char(10)
//if
some statement
set @tablename='test'
你想用变量
@tablename
的值作为表名创建一个新表
,那么用
create table @tablename (test char(8))
语句在
SQL server 2k
中执行就会遇到问题,
//
如果表不存在则创建
IF not EXISTS (SELECT name FROM sysobjects
WHERE name
=@tablename
AND type = 'U')
begin
set @createtable='create table '+ @tablename+' (myname
char(2))'
exec(@createtable)
最近写procedure,遇到一些问题。其中我觉得关于“用变量名作为表名”的问题较有价值,写出和大家一起分享。请各位若有好的解决方案一定要不吝赐教。情景:如果你在写procedure时要根据特定变量的值动态创建table(表名是全部或部分特定变量的值)。例如:declare @tablename char(10)//if some statements
1 :普通
SQL
语句可以用exec执行
Select * from tableName exec('select * from tableName')
exec sp_execute
sql
N'select * from tableName' -- 请注意字符串前一定要加N
2:字段名,
表
名,数据库名之类作为
变量
时,必须用动态
SQL
declare @fname v...
use E_Graphics_Card
if exists(select * from sys.objects where name='usp_Insert_Update_Bios_Info_Args')
drop proc usp_Insert_Update_Bios_Info_Args
CREATE PROC usp_Insert_Update_Bios_Info_Args
http://dev.my
sql
.com/doc/refman/5.7/en/
sql
-syntax-prepared-statements.html
sql
片段DELIMITER $$
USE `portal_group`$$
DROP PROCEDURE IF EXISTS `proc_sync_data`$$
CREATE DEFINER=`root`@`%` PROCEDURE `
DECLARE cur CURSOR FOR SELECT id FROM v_proc;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET @select = concat('create VIEW v_proc as SELECT ...
java操作有些数据库比如clickhouse暂时还用的是jdbc,执行
sql
时面临使用statement还是prepareStatement,其中statement写的简单不过会有
sql
注入最后安全检查不过。prepareStatement就不会,因为使用了占位符,?,像myBatis也是占位符,就不会有
sql
注入。
不过?只能替换值,不能替换
表
名,诸多原因,编译上的,还有?其实两边默认有单引号。那如何prepareStatement使用占位符替换
表
名呢?
答案简单的说,没有!
参考
sql
- Ho
坐看昀起: