--创建临时表,随机抽取2个发布产品的公司
select distinct top 2 CompanyUID,NEWID() ProductUID,'12345678901234567890' XhBrand,
80 XhPrice,GETDATE() Crtime into TB1
from [FariCEO].[dbo].[EC_SupplyInfo]
group by CompanyUID ORDER BY NEWID() --TB1事先不存在
--创建游标中需用的变量
Declare
@CompanyUID uniqueidentifier,
@ProductUID uniqueidentifier,
@TempUID uniqueidentifier,
@XhBrand nvarchar(20)
--创建游标,遍历抽取的公司
Declare Byd Cursor For Select CompanyUID from TB1
Open Byd
Fetch next from Byd Into @CompanyUID
While @@fetch_status=0
Begin
--根据公司名在该公司所发布的产品中随机找一个产品
select distinct top 1 @ProductUID=ProductUID,@XhBrand=Brand,@TempUID=NEWID() from [FariCEO].[dbo].[EC_SupplyInfo]
where CompanyUID=@CompanyUID order by NEWID()
--将该产品写入临时表中
Update TB1 Set ProductUID=@ProductUID,XhBrand=@XhBrand where CompanyUID=@CompanyUID
-- ......
2008数据库附加
/*
网上看到的整理了一下。
原文地址http://database.51cto.com/art/201003/190984.htm
在SQL Server 7.0中,微软推出了sp_attach_db和sp_attach_single_file_db系统存储过程。
它对于SQL Server数据库管理员执行下面的任务是非常方便的:
1 使用sp_attach_db系统存储过程直接将.MDF和.LDF文件附加到服务器。
2 使用sp_attach_single_file_db系统存储过程只附加.MDF文件。
3 使用sp_detach_db将数据库从一个服务器分离,复制.MDF文件到另一个服务器上,然后使用
sp_attach_db系统存储过程重新附加这些文件到两个服务器上。
尽管它对于SQL Server数据库管理员是很有用的,但是在使用这两个存储过程时是有一些限制的。限制如下:
1 你不能附加多个日志文件
2 你不能附加个以上的文件
在SQL Server 2008中,微软宣布上面的系统存储过程将在未来的版本中被废弃。而他们在"Create Database"
SQL语句中添加了一个从句 ......
一、简单查询
简单的Transact-SQL查询只包括选择列表、from子句和WHERE子句。
它们分别说明所查询列、查询的
表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
SELECT nickname,email
from testtable WHERE name='张三'
(一)选择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 量和全局变量)等构成。
1、选择所有列 例如,下面语句显示testtable表中所有列的数据: SELECT * from testtable
2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如: SELECT nickname,email from testtable
3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名 列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符。
例如,下列语句使用汉字显示列 标题: SELECT 昵称=nickname,电子邮件=email from testtable
4、删除重复行 SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 ......
1.字符串函数
长度与分析用
datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
substring(expression,start,length) 不多说了,取子串
right(char_expr,int_expr) 返回字符串右边int_expr个字符
字符操作类
upper(char_expr) 转为大写
lower(char_expr) 转为小写
space(int_expr) 生成int_expr个空格
replicate(char_expr,int_expr)复制字符串int_expr次
reverse(char_expr) 反转字符串
stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从
start开始的length个字符用char_expr2代替
ltrim(char_expr) rtrim(char_expr) 取掉空格
ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符
字符串查找
charindex(char_expr,expression) 返回char_expr的起始位置
patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0
abs(numeric_expr) 求绝对值
ceil ......
第一种:
SELECT
CASE
WHEN
price IS NULL THEN
'Not yet priced'
WHEN
price < 10 THEN
'Very Reasonable Title'
WHEN
price >= 10 AND
price < 20 THEN
'Coffee Table Title'
ELSE
'Expensive book!'
END
AS
"Price Category",
CONVERT(varchar(20), title) AS "Shortened Title"
from
pubs.dbo.titles
ORDER BY
price
第二种:
SELECT au_fname, au_lname,
CASE state
WHEN 'CA' THEN 'California'
WHEN 'KS' THEN 'Kansas'
WHEN 'TN' THEN 'Tennessee'
WHEN 'OR' THEN 'Oregon'
WHEN 'MI' THEN 'Michigan'
WHEN 'IN' THEN 'Indiana'
WHEN 'MD' THEN 'Maryland'
&nbs ......
有执行sql条件语句where id in(@参数)的时候,如果处理不当,就会出现问题:
如下面这个存储过程:
alter proc Web_gettwtwgoldgameserverGoldSell
@ID int
as
declare @twgoldsellID nvarchar(1000)
select @twgoldsellID=twgoldsellID from twgoldgameserver where ID=@ID
set @twgoldsellID=replace(@twgoldsellID,'|',',')
set @twgoldsellID=left(@twgoldsellID,len(@twgoldsellID)-1)
select * from twgoldsell where ID in (@twgoldsellID)
我们看上去好像没有什么问题,却在执行的时候报错:
消息 245,级别 16,状态 1,第 1 行
在将 varchar 值 '813,1160,1219,1227,1232' 转换成数据类型 int 时失败。
其实此条语句在执行时,
select * from twgoldsell where ID in (@twgoldsellID)
执行的语句是:select * from twgoldsell where ID in ('813,1160,1219,1227,1232')
这样执行当然出错,因为@twgoldsellID是一个字符串,现在是以参数的形式传递。
解决办法:
select * from twgoldsell where ID in (@twgoldsellID)
改为:
exec('select * from twgoldsell where ID in ('+@twgoldsellID+')')
记住:一定要加exec执行函数,不然会报如下错误 ......