Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Server在同一语句中同时使用Convert和Replace_Sql_Sql Server_Sql Convert - Fatal编程技术网

Sql Server在同一语句中同时使用Convert和Replace

Sql Server在同一语句中同时使用Convert和Replace,sql,sql-server,sql-convert,Sql,Sql Server,Sql Convert,我想再次检查SQL Server中的查询逻辑 我的想法是,我能够输入以下值,它将确保结果是一个带有四个尾随数字的十进制数 @LABORQTY的可能值: 1,200 1,200.42 1200 (Integer) 1200.42 1200 (As a String) 1200.42 (As a String) 当值为字符串时,它将给出错误: 将数据类型nvarchar转换为数字时出错。 这是我的密码: CONVERT(DECIMAL(12, 4), REPLACE(@LABORQTY,

我想再次检查SQL Server中的查询逻辑

我的想法是,我能够输入以下值,它将确保结果是一个带有四个尾随数字的十进制数

@LABORQTY
的可能值:

1,200

1,200.42

1200 (Integer)

1200.42

1200 (As a String)

1200.42 (As a String)
当值为字符串时,它将给出错误: 将数据类型nvarchar转换为数字时出错。

这是我的密码:

CONVERT(DECIMAL(12, 4), REPLACE(@LABORQTY, ',', ''))
但每次输出应为十进制:
1200.4200

您的问题真的很困惑,但我将根据以下参数回答:

@laborqty是一个VARCHAR

@laborqty可能会以某种方式包含以下任何值:

'1200'
'1200.42'
'1,200'
'1,200.42'
在这种情况下,
CONVERT(十进制数(12,4),REPLACE(@LABORQTY,,,,,”)
将产生一个小数精度高达4位的十进制数。查询工具/编程语言是否将其输出为1200.4200完全是另一回事;它很可能只输出1200.42并删除后面的零

如果将数据类型varchar转换为数字时出现
错误。
但是,数字字符串中还有一些其他字符数据(不是逗号)

如果确实需要尾随的零,请在输出前将其格式化为字符串

FORMAT(CONVERT(decimal(12,4), '1200.42'), '0.0000')
这将生成一个带有4个尾随零的字符串,您可以使用:

select CAST ( REPLACE( '1,200.4' , ',','') AS decimal(17,4))

你能把你的帖子格式化让它更有意义吗?“1200/1200.42/1200(整数)/1200.42/1200(作为字符串)/1200.42(作为字符串)`是某种除法公式吗?作为一个命名变量的@laborqty具有特定的单一类型,它是如何变为字符串、int、decimal..的?如何
声明@laborqty INT
,然后存储一个字符串小数“1200.42”?那么
@laborqty
的实际值是多少?它在所有情况下都是一个字符串(
nvarchar
),这还不够具体。如果您已将
@LABORQTY
声明为任何其他类型,则当您尝试为其分配不受支持的值(如
1200
)时,可能会发生错误,这些值是隐式转换的,而不是显式转换的。它不是通过SQL声明的,而是通过另一个应用程序声明的。该类型设置为默认值,在程序中为字符串
nvarchar
。对斜杠造成的混乱表示歉意。当输入它时,它并没有把值放在新行中,我需要一个分隔符。我没想到其他人会认为它更像是数字的分割而不是分离。我搞错了。所有的
#
是怎么回事?如果有更多的数字,格式字符串自然会“溢出”,因此
0.0000
就足够了。(如果
十进制
,则在格式化之前会发生溢出。)此外,值得注意的是,实际使用的分隔符取决于所在的区域性--如果不需要,最好明确指定
en US
。据我所知,格式基于.NET的格式化逻辑,使用
意味着“在此处放置区分区域性的小数分隔符”。因此,在一个使用
作为十进制分隔符的国家,使用0.0000的格式应该会产生
00000
的输出-请看,是的,这正是我的观点。从OP的问题中无法判断他们是否需要特定于当前区域性的格式,因此我指出,您可以向
FORMAT
传递一个附加参数来指定它。(通常情况下,人们实际上不希望格式因文化而异,当文字
变成
时,他们会感到惊讶)好吧,好吧。。这些评论包含一些方便的建议,OP和未来的访问者可以使用,或者他们可以根据需要查找格式。。我认为必须有一个限制,即停止在答案中添加细节,以免完全复制MSDN的内容。。也许我们对“应该向OP宣读多少文档”有不同的阈值(另请参见)