Sql server Varchar Sql Server Sum

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

我有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  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)))