把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
相关文档:
1:replace 函数
第一个参数你的字符串,第二个参数你想替换的部分,第三个参数你要替换成什么
select replace('lihan','a','b')
&nb ......
detachedCriteria.add(Restrictions.or(
Restrictions.like("chengBanDanWeiIds", rForm.getChengBanDanWeiIds()+(char)13, MatchMode.START),
Restrictions.or(
&n ......
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Collections;
using System.Data.SqlClient;
namespace DAL
{
/// <summary>
/// 数据库的通用访问代码
/// 此类为抽象类,不允许实例化,在应用 ......
.清空日志
DUMP TRANSACTION 库名 WITH NO_LOG
2.截断事务日志:
BACKUP LOG 库名 WITH NO_LOG
3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接 ......
外键
======================
外键是相对于主键说的,是建立表之间 的联系的必须的前提。
比如:学生表 、学生成绩表一一对应是因为 他们都具有相同的字段:学号,把学生表作为主表,学号是他的主键,相对于主表来说,学生成绩的字段 学号就是学生表的外键。
没有外键,两个表就没办法建立联系啊! ......