一个有用的SQL Server拼接合并函数:STUFF

在ERP里面有个仓库的固定默认库位(Fixed Location)表,结构如下:

WarehouseCode, ItemCode, LocationCode

同一个仓库里的料号,可以允许设置多个固定库位,可以设置优先级来区分。

现在需要把一个物料在一个仓库的固定库位取出来,多个的时候用,分割连接在一起。

SELECT WarehouseCode,ItemCode,LocationCode = (
        STUFF((SELECT ',' + LocationCode FROM WMS_DefaultLocation WHERE WarehouseCode = A.WarehouseCode AND ItemCode = A.ItemCode AND Enabled = 1 AND DeletionStateCode = 0 ORDER BY LocationCode ASC FOR XML PATH('')),1,1,'')
    ) FROM WMS_DefaultLocation AS A WHERE A.Enabled = 1 AND A.DeletionStateCode = 0 GROUP BY WarehouseCode,ItemCode

这里用到了STUFF和 FOR XML PATH,本文主要介绍STUFF。

用法及详解

STUFF(param1, startIndex, length, param2)
将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。

1、param1:一个字符数据表达式。param1可以是常量、变量,也可以是字符列或二进制数据列。
2、startIndex:一个整数值,指定删除和插入的开始位置。如果 startIndex或 length 为负,则返回空字符串。如果startIndex比param1长,则返回空字符串。startIndex可以是 bigint 类型。
3、length:一个整数,指定要删除的字符数。如果 length 比param1长,则最多删除到param1 中的最后一个字符。length 可以是 bigint 类型。
4、param2,返回类型。如果param1是受支持的字符数据类型,则返回字符数据。如果param1是一个受支持的 binary 数据类型,则返回二进制数据。

推荐一款好用的SQL2000 DTS备份迁移软件:DTS Backup 2000

公司的SQL Server 2000的DTS无故不能打开编辑DTS文件,错误信息如下。猜测原因为Windows补丁升级造成。

只好重新安装以前用过一次的[URL=http://www.sqldts.com/242.aspx]DTSBackup2000[/URL]的小软件,也因此放到Blog上面推荐一下这个很好用的免费软件。

尽管Sql Server 2005已经问世几年,但我相信很多公司还仍然大量的使用着Sql Server 2000的服务器,依然有很多在使用SQL 2000的DTS。那么DTS Backup 2000作为一款DTS包备份、恢复、迁移的免费工具,肯定会获得你的喜爱。

DTS Backup 2000介绍

下面是来自官方的介绍:

<br/>DTS Backup 2000 is a tool designed to help with both backup and transfer of DTS packages. The DTSBackup file format and direct transfer of packages between SQL Servers options do not suffer the loss of layout or annotations as you get when the DTS object model. It is of course free to use. <br/>

大家知道SQL server 2005以后,DTS已经被SSIS所替换,[URL=http://www.sqldts.com]SQLDTS.COM[/URL]也顺应这种发展,升级为[URL=http://www.sqlis.com]SQLIS.COM[/URL]。

DTS Backup 2000下载地址

官方地址:[URL=http://www.sqldts.com/redir.aspx?1242]http://www.sqldts.com/redir.aspx?1242[/URL]

DTS Backup 2000安装步骤如下

DTS Backup 2000使用说明

使用相当简单,支持4种Storage Location:Local Packages,Meta Data Services Packages,Structured Storage File, DTSBackup File。可以文件到文件、文件到数据库、数据库到数据库,同时支持备份加密功能。

Baan ERP SQL Query 中Exists的用法举例

很久都没有写Baan的报表以及查询了,上午远在深圳的Allen通过MSN告诉我一个小小的需求,于是用到了Exists的查询,代码分享如下:

正常的关联写法

select
tdsls401.orno,
tdsls401.pono,
tdsls401.sqnb
from
tdsls401, | Sales Order Lines
whinh430, | Shipment
whinh431 | Shipment Lines
where
whinh431.worn = tdsls401.orno and
whinh431.wpon = tdsls401.pono and
whinh431.wseq = tdsls401.sqnb and
whinh430.pcsp = tcyesno.yes and
whinh431.shpm = whinh430.shpm and
(whinh431.worg = whinh.oorg.sales or
whinh431.worg = whinh.oorg.purchase)
order by tdsls401.orno,tdsls401.pono

反选的时候,用Not Exists

select
tdsls401.orno,
tdsls401.pono,
tdsls401.sqnb
from
tdsls401 | Sales Order Lines
where not exists
(select *
from
whinh430, | Shipment
whinh431 | Shipment Lines
where
whinh431.worn = tdsls401.orno and
whinh431.wpon = tdsls401.pono and
whinh431.wseq = tdsls401.sqnb and
whinh430.pcsp = tcyesno.yes and
whinh431.shpm = whinh430.shpm and
(whinh431.worg = whinh.oorg.sales or
whinh431.worg = whinh.oorg.purchase))
order by tdsls401.orno,tdsls401.pono

其实第一种正常查询中,查询多个表中关联出现的结果集也可以用Exists:

select
tdsls401.orno,
tdsls401.pono,
tdsls401.sqnb
from
tdsls401 | Sales Order Lines
where exists
(select *
from
whinh430, | Shipment
whinh431 | Shipment Lines
where
whinh431.worn = tdsls401.orno and
whinh431.wpon = tdsls401.pono and
whinh431.wseq = tdsls401.sqnb and
whinh430.pcsp = tcyesno.yes and
whinh431.shpm = whinh430.shpm and
(whinh431.worg = whinh.oorg.sales or
whinh431.worg = whinh.oorg.purchase))
order by tdsls401.orno,tdsls401.pono

SQL Server 多表更新方法

早晨从济南返回,接着到公司上班。继续没完成的项目开发,遇到了批量数据导入后,多表更新的问题。记得以前用access实现起来很简单的,可是到了SQL Server居然行不通了。只好求助搜索引擎,分享一下吧。

问题描述:

2个表:Table1 Table2 字段Table1.Field1关联Table2.Field1
要求:关联更新TblA中的字段Field2,Field3,使Table1.Field2=Table2.Field2,Table1.Field3=Table2.Field3

SQL语句写法:

UPDATE Table1
SET Field2=b.Field2,Field3=b.Field3
FROM Table1 a, Table2 b
WHERE a.Field1=b.Field1

A sample of Flat File Source Data conversion failed

今天上午遇到的问题,当从文本文件倒入数据到Sqlserver 2005时出现一下错误:"[Flat File Source [1]] Error: Data conversion failed. The data conversion for column “Column 2” returned status value 4 and status text “Text was truncated or one or more characters had no match in the target code page.”. "。数据来源是Baan系统,出错的字段是供应商名称,查了一下Oracle数据库,知道这个字段长度为60个字符。而在做Data Conversion的时候,默认的转换为Unicode String[DT_WSTR] 50(见下图),这里只能改成60才行。

title

但是关键问题不是这里!请往下看。

文本文件的数据源在SSIS建立好了以后,每一个字段类型默认都是string [DT_STR],而OutputColumn的长度都是50。问题就在这里!只需要按照下图的位置设定一下数据类型或者长度就可以了!我这里试了修改数据类型为“text stream [DT_TEXT]”,测试通过;然后修改OutputColumn的长度为60,同样测试通过!

title

SQL Server 2005 SSIS学习:Data Conversion Object

今天在使用SSIS从Sql Server 2000导出数据到Sql Server 2005中的时候出现了以下错误。

<br/><br/>Error at StaffViewBak [OLE DB Destination [16]]: Column "Staff_Name" cannot convert between unicode and non-unicode string data types.<br/><br/>Error at StaffViewBak [DTS.Pipeline]: One or more component failed validation.<br/><br/>Error at StaffViewBak: There were errors during task validation.<br/><br/> (Microsoft.DataTransformationServices.VsIntegration)<br/><br/>

这个原因是因为原数据库和目标数据库的字符类型不同造成的,我从网上搜了一下,没有中文资料,英文资料简单的介绍了一下。我试了几种,发现还是用“DataConversion”比较好。

title

Data Conversion can convert between unicode and non-unicode string data types

Is Null

一个简单的问题,但是也许很多人都用错.

当数据库的一个字段Field的默认值为Null时,如何在SQL的查询\更新\添加时做判断,又如何在ASP语言中做判断?

SQl语句中

Select Field from Table Where Field is Null
or
Select Field from Table Where Field is Not Null

Update Table Set Field=Null Where Field =?

Insert Into Table (Field, TransDate) Values (NULL, GETDATE())
ASP中

错误的用法
If Rs(“Field”) Is Null Then
Update
End if

正确的用法
If IsNull(Rs(“Field”)) Then
Update
End if

下一步的计划和发展方向

最近得到了一份Offer,决定了一下步的发展方向和研究领域:
1、数据库方面,以MSSQL为主,渐渐转向Oracle数据库
2、网页设计方面渐渐转入Flash website and Flash game
3、网络编程方面从原来的ASP环境逐渐升级到.net(C#)版本
4、个人职业发展从Designer or Programmer 变化为Team work and Team leader
5、Flash方面着重研究Actionscript2的编程,然后就是基于Database和XML的Flash应用设计
6、系统管理方面开始对Web server\Exchange Server\Ftp Server进行直接的管理和应用
7、英语学习方面,因为的确吃了苦头,坚持每天学习英语,提高英语听说读写能力

这个周末去书店和Dearbook.com逛一下,掏几本好书看看。