Sql server Varchar Sql Server Sum
我有ms access数据库,我想转换Sql Server 我的txTotal列的值为15,50 1,25 10,00 我的求和功能非常有用我的旧access数据库此查询:Sql server Varchar Sql Server Sum,sql-server,vb.net,Sql Server,Vb.net,我有ms access数据库,我想转换Sql Server 我的txTotal列的值为15,50 1,25 10,00 我的求和功能非常有用我的旧access数据库此查询: dtfr = DateTimePicker1.Value dtto = DateTimePicker2.Value sqlcmd = "SELECT SUM(txttotal) as Total from table WHERE odate >= CDate('" + dtfr + "') AND od
dtfr = DateTimePicker1.Value
dtto = DateTimePicker2.Value
sqlcmd = "SELECT SUM(txttotal) as Total from table WHERE odate >= CDate('" + dtfr + "') AND odate <= CDate('" + dtto + "')"
sqlcmd = "SELECT SUM(CAST(txttotal as ?)) as Total from table WHERE odate BETWEEN '" + dtfr + "' AND '" + dtto + "'"
我试过浮点数,整数,双精度
将数据类型varchar转换为float时发生SqlException错误
编辑:我的txttotal列是varchar首先创建一个拆分字符串函数
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING AS
RETURN
WITH E1(N) AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1),
E2(N) AS (SELECT 1 FROM E1 a, E1 b),
E4(N) AS (SELECT 1 FROM E2 a, E2 b),
E42(N) AS (SELECT 1 FROM E4 a, E2 b),
cteTally(N) AS (SELECT 0 UNION ALL SELECT TOP (DATALENGTH(ISNULL(@List,1)))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E42),
cteStart(N1) AS (SELECT t.N+1 FROM cteTally t
WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0))
SELECT Item = SUBSTRING(@List, s.N1, ISNULL(NULLIF(CHARINDEX(@Delimiter,@List,s.N1),0)-s.N1,8000))
FROM cteStart s;
现在,使用交叉应用将值传递给函数,并在聚合之前将其拆分。试试这样的
SELECT Sum(item) AS Total
FROM table
CROSS apply dbo.Splitstrings(txttotal, ',') sp
WHERE odate BETWEEN x AND y
检查以下链接以创建拆分字符串函数
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING AS
RETURN
WITH E1(N) AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1),
E2(N) AS (SELECT 1 FROM E1 a, E1 b),
E4(N) AS (SELECT 1 FROM E2 a, E2 b),
E42(N) AS (SELECT 1 FROM E4 a, E2 b),
cteTally(N) AS (SELECT 0 UNION ALL SELECT TOP (DATALENGTH(ISNULL(@List,1)))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E42),
cteStart(N1) AS (SELECT t.N+1 FROM cteTally t
WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0))
SELECT Item = SUBSTRING(@List, s.N1, ISNULL(NULLIF(CHARINDEX(@Delimiter,@List,s.N1),0)-s.N1,8000))
FROM cteStart s;
不要使用字符串连接将数据放入SQL查询
这会导致Sql注入攻击。问题完全清楚,您需要什么值,但是假设示例是由逗号分隔的4条记录,并且您只需要每条记录中空格前的部分,请按如下方式操作:
Dim sql As String = _
"SELECT SUM(CAST(LEFT(txttotal, " & _
" CASE WHEN charindex(' ', txttotal) = 0 THEN LEN(txttotal) ELSE charindex(' ', txttotal) - 1 END " & _
" ) As Integer)) as Total" & _
" FROM table WHERE odate >= @DateFrom AND odate <= @DateTo"
Using cn As New SqlConnection("connection string here"), _
cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@DateFrom", SqlDbType.DateTime).Value = DateTimePicker1.Value
cmd.Parameters.Add("@DateTo", SqlDbType.DateTime).Value = DateTimePicker2.Value
cn.Open()
Dim rdr As SqlDataReader = cmd.ExecuteReader()
'Do something with the reader here
End Using
你可能需要一个,而不是一个。取决于服务器的区域性安装。Sql Server 2012还有一个新的解析函数,允许您指定区域性,从而消除了升级更改系统本地区域性时出现歧义的可能性。尽管我不喜欢以这种方式保存数据,但听起来您有历史原因。 对于SQL Server 2005+2008+?您可以将varchar列转换为有效的xml,并在其上执行SQL表达式。还有其他可能性,但因此您必须使用过程代码存储过程/用户定义函数和/或临时表或表变量将日期拆分为表格形式 因为生成的查询不太容易理解,所以我将从一个示例开始,在这个示例中,varchar类型的变量中有一个txtotal值的内容 首先,将txttotal转换为一个有效的xml片段,您必须添加开始标记和结束标记,还必须替换十进制分隔符。并将结果强制转换为XML数据类型 现在可以选择所有节点。。。从@xmltotal.nodes'/v'。。。从该xml变量执行XQuery表达式。。。p、 值“.”,“浮点”。。。将它们转换/转换为T-SQL数据类型FLOAT,并最终将这些值相加 声明@txttotal VARCHARMAX 声明@xmltotal XML 选择@txtotal='15,50 1,25 10,00' 选择@xmltottal=CAST+REPLACEREPLACELTRIMRTRIM@txttotal,,,,,,,,,,,,+作为XML - -> 15.501.2510.00 从@xmltotal.nodes'/v'tp中选择SUMp.value'.'和'FLOAT' 所有这些都可以用来编写一条符合您需求的声明性SQL语句 从xmltotal.nodes'/v'tp中选择SELECT-seash.value'.'和'FLOAT' 从…起 选择 将+replaceltrimrtrimtxttotal,',',','',''转换为XML形式的xmltotal 从…起 桌子 -在哪里 -在这里添加您所需的条件! T
你确定这不是文化问题吗?你有没有试过使用。而不是,作为小数点分隔符?我需要使用,字符作为货币分隔符。您使用的是c还是vb.net?而且,在这个问题中,TXTOTALL列包含什么还不清楚。问题中的样本是一行样本,还是用逗号分隔的4行样本?除此之外,还不清楚您希望sql server如何解释其中一些值。例如,应该将50 1值解释为50还是501?最后。。。编写的代码极易受到sql注入攻击。永远不要使用字符串连接将用户提供的数据替换到查询中,当然解决问题的最佳方法是修复模式,将数字数据存储在数字列中。sum işleci için işlenen veri türüvarchar geçersiz。翻译:为果汁处理器varchar处理的数据类型无效。编辑:我的TXTOTALL列为varchar
SUM(CAST(REPLACE(txttotal, ' ', '.') As numeric(5,2)))