我有一个名为DOB
的日期变量。我只是想更新表格,因此DOB
只是DOB的年份
第一个计划是更新
@table set @variable = convert(int, year(@variable))
或类似
set @variable = year(@variable)
但它首先告诉我我无法将datetime转换为int
然后我试着说
DOBint = year(DOB)
等等,但我最终放弃了DOB,因为
Msg 5074,Level 16,State 1,Line 1
统计数据“DOB”取决于“DOB”列。Msg 4922,Level 16,State 9,Line 1 ALTER TABLE DROP COLUMN DOB失败,因为一个或多个对象访问此列。
即使这是一个数据库,我只是从服务器复制到我的机器上玩和测试。
drop statistics traveldoc.DOB
什么都不做
和
select * from sys.stats where name = 'DOB'
似乎应该有一种简单的方法可以做到这一点,而无需删除/添加列然后重命名列
从日期中删除日期和月份并将其保留在同一变量上的简单方法?
我正在使用SQL Server 2008
由于
编辑: 我职能的大部分内容
DECLARE @action nvarchar(MAX);
DECLARE @table nvarchar(128);
DECLARE @variable nvarchar(MAX);
DECLARE rowCurser CURSOR FOR SELECT [Column1], Column2, Column3 FROM tempdb.dbo.DataAvailableForAnalysis;
OPEN rowCurser;
FETCH rowCurser INTO @table, @variable, @action
WHILE @@FETCH_STATUS = 0
BEGIN
SET @action = REPLACE(REPLACE(@action, '@table', @Table), '@variable', @variable);
--if OBJECT_ID(N'@table',N'U') IS NOT NULL
--BEGIN
EXECUTE(@action);FETCH rowCurser INTO @table, @variable, @action
--END
END
CLOSE rowCurser;
DEALLOCATE rowCurser;
在这种情况下,此变量的@action将是
declare @variable datetime update @table set @variable= DATEPART(YYYY,@variable)
更新#2:
所以我认为添加一些上下文会有所帮助 我有一个表格,其中包含某些变量/表格
的操作,例如
create table ##actiontable
(
actionname nvarchar(max) ,
tablename nvarchar(128),
variablename nvarchar(max)
)
insert into ##test3
values ('update @table set @variable=1', 'NcsAnalytics13.dbo.ReplicationObject', 'Target' )
在这种情况下,变量target将在表NcsAnalytics13.dbo.ReplicationObject
中设置为1我真正的## actiontable充满了针对不同变量的不同更新语句。我唯一一个无法更新的是DOB,我想从变量中删除日期和月份(这是为了消除个人身份信息)。我需要保持相同的变量名称,但很难能够创建新变量,删除旧变量,并重命名,因为由于某种原因有一些统计数据连接到DOB,我无法弄清楚,所以我不能放弃它。 / p>
答案 0 :(得分:3)
你想要datepart
@variable = DATEPART(yyyy,@ Variable)
http://www.w3schools.com/sql/func_datepart.asp
Declare @variable datetime, @converted int, @converted2 datetime Set @variable = GetDate(); Set @converted = Cast(DatePart(yyyy, @variable) as int) Set @converted2 = Cast('1/1/' + cast(@converted as varchar) as datetime) select @variable; Select @converted; Select @converted2;
根据您的更新更新
DECLARE @action nvarchar(MAX);
DECLARE @table nvarchar(128);
DECLARE @variable datetime;
DECLARE rowCurser CURSOR FOR SELECT [Column1], Column2, Column3 FROM tempdb.dbo.DataAvailableForAnalysis;
OPEN rowCurser;
FETCH rowCurser INTO @table, @variable, @action
WHILE @@FETCH_STATUS = 0
BEGIN
SET @action = REPLACE(REPLACE(@action, '@table', @Table), '@variable', cast(DATEPART(yyyy,@variable) as varchar));
--if OBJECT_ID(N'@table',N'U') IS NOT NULL
--BEGIN
EXECUTE(@action);FETCH rowCurser INTO @table, @variable, @action
--END
END
CLOSE rowCurser;
DEALLOCATE rowCurser;
答案 1 :(得分:1)
您不能将列从date更改为int,因此首先转换为varchar,然后提取年份并再次将列更改为int。
ALTER TABLE YourTable
ALTER COLUMN DOB VARCHAR(30)
UPDATE YourTable
SET DOB = YEAR(CAST(DOB AS DATE))
--SELECT * FROM YourTable
ALTER TABLE YourTable
ALTER COLUMN DOB INT
--SELECT * FROM YourTable
答案 2 :(得分:1)
您可能只需添加一个新的计算列:
ALTER TABLE tempdb.dbo.DataAvailableForAnalysis
ADD DobYear AS YEAR(DOB) PERSISTED;
然后您同时拥有实际的完整DOB
以及DobYear
列