如何在不同数据类型的SQL Server中交换列值

时间:2015-01-28 04:24:22

标签: sql sql-server sql-server-2008

我在SQL Server 2008中有一个表,如T1, and have column like C1和C2`

我只想交换C1 to C2C2 to C1

的值

例如

C1              C2
--------        --------
12/11/2014      12/10/2014
12/13/2014      12/12/2014
12/15/2014      12/14/2014
12/17/2014      12/16/2014
12/19/2014      12/18/2014

我需要记录如下

C1              C2
--------        --------
12/10/2014      12/11/2014
12/12/2014      12/13/2014
12/14/2014      12/15/2014
12/16/2014      12/17/2014
12/18/2014      12/19/2014

因为我正在尝试类似下面的内容

UPDATE T1 SET C1=C2, C2=C1

编辑:

我收到Conversion failed when converting date and/or time from character string.错误。 C1为nvarchar(50) datatype,C2为DateTime

我将DateTime.Now.Date存储在C1中,但它将取决于Window的区域设置,如果Date设置为"MM-DD-yyyy"格式则在C1值中将采用相同的格式。我的主要问题是一段时间用户可以将其窗口设置更改为任何其他格式,因此我得到了说错误。

How do I swap column values in sql server 2008?的答案由于具有相同的数据类型而无法满足我的要求

我很抱歉只提供int Value

3 个答案:

答案 0 :(得分:1)

--drop table #TableA
SELECT  *
into #TableA
FROM    (
    select  10 Num1 , 11 Num2
        union
    select  12 Num1 , 13 Num2
        union
    select  14 Num1, 15 Num2
        union
    select  16 Num1 , 17 Num2
        union
    select  18 Num1 , 19 Num2
) a

update #TableA SET Num1 = Num2 , Num2 = Num1

SELECT  *
FROM    #TableA

答案 1 :(得分:1)

您的查询适合您。这是示例并给出了完美的结果。

declare @t table(c1 int, c2 int)

insert into @t values(10,11),(11,13),(14,15),(16,17),(18,19)
select * from @t
update @t set c1 = c2 ,c2=c1

select * from @t

更新: - 请检查我的答案。

您可以通过"set dateformat mdy"

在sqlserver端设置dateformat
set dateformat dmy
select isdate( '18/12/2014' ), convert( datetime, '18/12/2014' ,103)

you can use ISDATE with convert date function.

set dateformat mdy
--the problem is in your insert not in update, if data is save in 'mm-dd-yyyy', then no issue with swap.
;with cte as (
    select 
        case when isdate('19/12/2014') = 1
             then '19/12/2014'
             else convert( datetime, '19/12/2014' ,103)
        end stdt
    from @t
)

select * from cte

--update @t set c1 = c2 ,c2=c1
--select * from @t

答案 2 :(得分:1)

您的查询将有效,如果您想要其他方法,可以按照以下方法进行操作

select* from tablename;
Go

DECLARE @tempcol as int
update tablename
set    @tempcol= C1,
       C1= C2,
       C2= @tempcol

(如果您有任何条件)     条件;     GO

select* from tablename;