如何在SQL Server 2012中返回包含文本和其他列值的列

时间:2014-10-30 16:49:48

标签: sql sql-server-2012

我正在使用SQL Server 2012,我有一个表Accounts

  [ClientId] | [AccNumber] | [AccBalance]

此查询正常工作:

   SELECT TOP 5
        [ClientId]
        ,[AccNumber]
        ,[AccBalance]
   FROM [MyDB].[dbo].[Accounts]

但所有这些都是表Accounts包含的列。现在我想添加另一个列,它将返回一些最终应该看起来像描述每个帐户的简短文本。

或者更清楚一点,我试图补充一下:

  SELECT TOP 5
      [ClientId]
      ,[AccNumber]
      ,[AccBalance]
      ,('Client Number = ' + [ClientId] + 'Account Number = ' + [AccNumber] + 'Account Balance = ' + [AccBalance]) as txt
  FROM [MyDB].[dbo].[Accounts]

但是,当我尝试在SQL Server Management Studio中执行此操作时,出现此错误:

  

转换varchar值'Client Number ='时转换失败   数据类型int。

有没有办法让它有效?

2 个答案:

答案 0 :(得分:3)

SQL Server不会自动将INTDECIMAL转换为字符串 - 您需要明确地执行此操作:

 SELECT TOP 5
      [ClientId]
      ,[AccNumber]
      ,[AccBalance]
      ,('Client Number = ' + CAST([ClientId] AS VARCHAR(10)) + 
        'Account Number = ' + CAST([AccNumber] AS VARCHAR(20)) + 
        'Account Balance = ' + CAST([AccBalance] AS VARCHAR(20)) as txt
  FROM [MyDB].[dbo].[Accounts]

如果您没有明确指定任何内容,T-SQL将尝试将所有内容转换为排名最高的数据类型 - 而INTVARCHAR更“重要”(排名更高),所以T -SQL将尝试将您的字符串文字转换为INT(显然会失败)

有关数据类型如何排名的完整列表,请参阅MSDN docs on datatype precedence

答案 1 :(得分:1)

这是由于(我假设)你的clientId,accNumber,accBalance(或它们的任意组合)属于int类型。你可以通过以下方式完成你的需要:

  SELECT TOP 5
   [ClientId]
  ,[AccNumber]
  ,[AccBalance]
  ,('Client Number = ' + convert(varchar(50), [ClientId]) + 'Account Number = ' + convert(varchar(50),[AccNumber]) + 'Account Balance = ' + convert(varchar(50),[AccBalance])) as txt
  FROM [MyDB].[dbo].[Accounts]

作为一个例子。

另一种(我认为更好)的方法是在UI上执行此操作,因为构建字符串的所有信息都已经位于您的行/对象中。