请教大师,sql如何替换所有表中含有#的数据
2个回答
展开全部
表数量多么,所有字段都要更新?
给个思路先:
查询所有表中带有字符型字段的字段(varchar,nvarchar 其他类型酌情考虑)
select SO.name as t_name, SC.name as f_name,ST.name as f_type from
sysobjects SO, -- 对象表
syscolumns SC, -- 列名表
systypes ST -- 数据类型表
where SO.id = SC.id
and SO.xtype = 'U' -- 类型U表示表,V表示视图
and SO.status >= 0 -- status >= 0 为非系统对象
and SC.xtype = ST.xusertype
and st.name in ('varchar','nvarchar')
order by SO.name,sc.name
2.根据查询出的表名和所属字段,拼接出各表的update 语句
方法有很多种,比如从上边SQL查处的结果里把表名抽出来,逐个传入以下语句
declare @str varchar(4000)
declare @strTN varchar(100)
set @strTN = 'CSVTable' --定义表名
set @str = ''
select @str = @str + ',' + SC.name + '=REPLACE(' + SC.name + ',''#'','''')' from
sysobjects SO, -- 对象表
syscolumns SC, -- 列名表
systypes ST -- 数据类型表
where SO.id = SC.id
and SO.xtype = 'U' -- 类型U表示表,V表示视图
and SO.status >= 0 -- status >= 0 为非系统对象
and SC.xtype = ST.xusertype
and st.name in ('varchar','nvarchar')
and SO.name = @strTN
order by SO.name,sc.name
IF @str <> '' set @str= 'update ' + @strTN + ' set ' + SUBSTRING(@str,2,4000)
PRINT @str --打印出SQL
exec(@str) --执行SQL
展开全部
所有的默认值都丢失了。主要是数字类型和日期类型。
所有now(),time(),date()要改成getdate()。
所有datediff('d', time1, time2)要改成datediff(day, time1, time2)
有可能一些true/false类型不能使用,要变为1/0。
备注类型要通过cast(column as varchar)来使用。
CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1,否则记录可能显示不完整。
isnull(rowname)要改成rowname = null
ACCESS的数据库中的自动编号类型在转化时,sql server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号!
转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。有时用smalldatetime型时,转化失败,而用datetime型时,转化成功。
对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:delete * from user where id=10,而对SQL SERVER数据库进行删除是用:delete user where id=10.
日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。
所有now(),time(),date()要改成getdate()。
所有datediff('d', time1, time2)要改成datediff(day, time1, time2)
有可能一些true/false类型不能使用,要变为1/0。
备注类型要通过cast(column as varchar)来使用。
CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1,否则记录可能显示不完整。
isnull(rowname)要改成rowname = null
ACCESS的数据库中的自动编号类型在转化时,sql server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号!
转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。有时用smalldatetime型时,转化失败,而用datetime型时,转化成功。
对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:delete * from user where id=10,而对SQL SERVER数据库进行删除是用:delete user where id=10.
日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询