计算列应该返回字符串。

8

这是我的数据库快照。

col1和col2都被声明为int类型。

我的ComputedColumn目前将列1和列2相加,如下所示...

col1  col2  ComputedColumn
1     2     3
4     1     5

我的ComputedColumn应该将列1和列2连接起来(包括中间的'-'字符),而不是像现在这样。

col1  col2  ComputedColumn
1     2     1-2
4     1     4-1

那么,正确的语法是什么?
5个回答

10

你可能正在定义计算列为col1+col2。尝试改为CAST(col1 AS NVARCHAR(MAX))+'-'+CAST(col2 AS NVARCHAR(MAX))

或者,如果你喜欢,你可以将NVARCHAR(MAX)替换为NVARCHAR(10)或其他长度。


1
我认为NVARCHAR(MAX)有些过头了!它们是INT,因此有最大长度,不能包含任何奇怪的Unicode字符!!!所以varchar(11)就可以了。 - KM.
@KM 说得好,特别是关于 VARCHARNVARCHAR 的区别。长度不是太重要 - 只要行的总长度不超过允许的行大小(4K?),我相信使用 MAX 和你建议的长度为11之间没有实际差别。 - Dathan
如果这是一个未持久化的计算列,您将可能进行数百万次计算,具体取决于对该列进行了多少个SELECT操作。我认为在(MAX)与(n)列上进行字符串操作时会存在一些开销。为什么要冒险呢?int不能大于varchar(11)。 - KM.
@KM 是的,你可能是对的。对于表中的短字段(假设表设置为“大文本行外= false”),读取和写入时间应该没有明显的差异。但我找不到有关处理开销或查询结果中如何处理MAX字段的文档。所以我肯定会选择你的版本-宁愿安全也不要后悔。 - Dathan

4
create table TableName
(
    col1 int,
    col2 int,
    ComputedColumn as Convert(varchar, col1) + '-' + Convert(varchar, col2)
)

请记住,如果任何一个值为null,那么ComputedColumn的结果也将是null(使用默认排序规则和设置)。

0

简单:

SELECT ComputedColumn = convert(varchar, col1) + '-' + convert(varchar, col2)
  FROM Table

0
SELECT col1, col2, (col1 + '-' + col2) as ComputedColumn

“+”既是加法运算符,也是连接字符。你可以显式地进行转换,但在这种情况下,包含“-”在中间应该会导致隐式转换。

2
我认为它并没有。它仍然添加了这些列。 - OrElse
啊,这很有趣,但我想我知道为什么。SELECT 4+'a'+6返回一个语法错误“将varchar值'A'转换为int数据类型的列时出现语法错误”,所以它一定是在错误地进行隐式转换(它将'-'转换为整数(0),然后将它们全部加在一起)。 - BradC

0

首先在设计模式下创建表格

添加两列作为col1和col2

再添加一列computedcolumn并设置计算列属性

enter image description here

你也可以使用以下脚本

CREATE TABLE [dbo].[tbl](
[col1] [varchar](50) NOT NULL,
[col2] [varchar](50) NOT NULL,
[ComputedColumn]  AS ((CONVERT([varchar],[col1],(0))+'-')+CONVERT([varchar],[col2],(0)))

)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接