把SQL Server数据表的内容转换为相应的INSERT语句
笔者曾在《程序员》2009年11期上探讨Transact-SQL的元编程,即通过目录视图、元数据函数等方式访问数据库的元数据信息,在执行过程中动态生成SQL脚本。当时限于篇幅,所给的例子较少。这里给出动态生成SQL脚本的一个典型应用,把数据表的内容转换为相应的INSERT语句。
这个启发来自我管理远程数据库的经历。我常常需要用本地SQL Server数据库中的一个表的内容,去更新远程数据库中同名表中的内容。表中的内容只有数十行。网管屏蔽了数据库的1433端口,我只能使用远程桌面登录上去访问数据库。远程桌面支持剪贴板复制粘贴,也支持文件传输,剪贴板对于传输少量的文本数据很方便,文件传输要麻烦些且不太安全。我希望能把本机从表中查询出来的内容转换为INSERT语句,这样的话,就可以方便地复制到远程机器上执行。
由于生成的INSERT语句既取决于表的结构,也取决于表中的数据,生成这样的脚本是比较麻烦的。按照循序渐进的原则,我们先考虑简单的情况,假定数据表的结构是已知的。这里虚构了一个表,包含了几种代表性数据类型,但不含二进制数据。下面是表的定义脚本:
CREATE TABLE t1(
c1 INT,
c2 VARCHAR(10),
c3 DATETIME
)
我们依次看各个列在INSERT语句中是怎么表示的。整数列不需要任何修饰,但由于动态生成的SQL语句是文本,列的值需用CAST或CONVERT函数转换为字符串。字符串列需要用单引号括起来。注意每个单引号在字符串中需用两个单引号表示。日期类型既需要转换,又得用单引号括起来,这里日期类型显示的格式并不重要。这样,生成的INSERT语句的脚本应该像下面这个样子:
SELECT 'INSERT INTO t1 SELECT '
+ CAST(c1 AS VARCHAR(100)) +','
+ ''''+c2+'''' +','
+ ''''+CAST(c3 AS VARCHAR(100))+''''
from t1
上面的脚本忽略了一个特殊但很常见的值,就是NULL。不管列本来的数据类型是什么,值为NULL时在INSERT语句中总是用字符串NULL表示,不加引号。我们可以用CASE函数处理值为NULL的情况。这样,上面的脚本改进为:
SELECT 'INSERT INTO t1 SELECT ' +
CASE
WHEN c1 IS NULL THEN 'NULL'
ELSE CAST(c1 AS VARCHAR(100))
END +',' +
CASE
WHEN c2 IS NULL THEN 'NULL'
ELSE ''''+c2+''''
END +',' +
CASE
WHEN c3 IS NU
相关文档:
在SQL*Plus中默认的"&"表示替代变量,SQL*Plus认为&符后面的字符串为变量;只要在命令中出现该符号,SQL*Plus就会要你输入替代值。这就意味着你无法将一个含有该符号的字符串插入或更新到数据库
set define off 关闭替代变量功能,“&”将作为普通字符
set def ......
--oracle优化slq语句
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):
Oracle的解析器按照从右到左的顺序处理from子句中的表名,from子句中写在最后的表(基础表 driving table)将被最先处理,在from子句中包含多个表的情况下,您必须选择记录条数最少的表作为基础表。假如有3个以上的 ......
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
using System.Data.SqlClient;
namespace DAL
{
/// <summary>
/// 数据库的通用访问代码
/// 此类为抽象类,不允许实例化,在应用 ......
ORACLE 中SQL 语句大致可以分为4大类
1.DQL(data quary language 数据查询语言)
数据查询语言DQL基本结构是由SELECT子句,from子句,WHERE子句组成
2.DDL(data definition language 数据定义语言)
CREATE
ALTER
DROP
RENAME
TRUNCATE
3.DML(data manipulation language 数据操纵语言)
INSERT
UPDATE
......
一、什么是SQL注入式攻击?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表
单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻
击过程类如:
......