小编one*_*hen的帖子

将varchar值转换为int时转换失败

Microsoft SQL Server 2008(SP1),出现意外的"转换失败"错误.

不太清楚如何描述这个问题,所以下面是一个简单的例子.CTE使用搜索条件提取某些ID的数字部分,以确保数字部分实际存在.然后使用CTE查找最低的未使用序列号(种类):

CREATE TABLE IDs (ID CHAR(3) NOT NULL UNIQUE);

INSERT INTO IDs (ID) VALUES ('A01'), ('A02'), ('A04'), ('ERR');

WITH ValidIDs (ID, seq)
AS 
(
 SELECT ID, CAST(RIGHT(ID, 2) AS INTEGER)
   FROM IDs 
  WHERE ID LIKE 'A[0-9][0-9]'
)
SELECT MIN(V1.seq) + 1 AS next_seq
  FROM ValidIDs AS V1
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM ValidIDs AS V2
                    WHERE V2.seq = V1.seq + 1
                  );
Run Code Online (Sandbox Code Playgroud)

错误是'将varchar值'RR'转换为数据类型int时转换失败.

我无法理解为什么ID = 'ERR'应该考虑转换值,因为谓词ID LIKE 'A[0-9][0-9]'应该从结果集中删除了无效的行.

当基表用等效的CTE代替时,问题就消失了,即

WITH …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2008

8
推荐指数
1
解决办法
2万
查看次数

SQL VIEW应该始终在1NF吗?

SQL VIEW是一个全局逻辑表,可以保留也可以不保留.但它仍然是一张桌子.因此,VIEW应该始终遵循第一范式(1NF)吗?即没有重复的行,只有标量类型,没有从上到下或从左到右的顺序等等.更高的正常形式呢?

对我来说,我的应用程序"消耗"存储过程的结果,我的VIEW被SQL查询"消耗",并且这两个用法是互斥的(即我不使用SQL查询存储过程的结果集,而我的应用程序不包含SQL代码).我见过其他人使用VIEW将列中的多个值"连接"成一行,通常是逗号分隔格式.在针对此类列的SQL查询中编写谓词需要类似于以下的kludges:

',' + concat_col + ',' LIKE '%' + ',' + search_value + ',' + '%'
Run Code Online (Sandbox Code Playgroud)

因此,我认为可以查询的所有表只包含标量类型似乎是合理的.想到这一点,我是否过于"纯粹主义"?

sql normalization

7
推荐指数
3
解决办法
743
查看次数

更改列的默认值

我有一个表'CompanyID int not null'的表,其默认值设置为10.现在我想编写一个查询,将此默认值更改为1.我怎么能这样做?

任何帮助将不胜感激.我正在使用SQL Server 2000.

sql default sql-server-2000

7
推荐指数
3
解决办法
2万
查看次数

SQL中的Dynamic Like语句

我一直在讨论如何做这个问题,我知道这个网站上的一些天才会得到答案.基本上我正在尝试这样做:

SELECT column 
  FROM table 
 WHERE [table].[column] LIKE string1 
       OR [table].[column] LIKE string2 
       OR [table].[column] LIKE string3...
Run Code Online (Sandbox Code Playgroud)

用于存储在表的列中的搜索字符串列表.显然我不能手动为每个字符串做一个类似的声明,因为我希望表是动态的.

任何建议都会很棒.:d

编辑:

我正在使用MSSQL :(

sql sql-server sql-like

7
推荐指数
1
解决办法
2万
查看次数

尝试对MS Access执行"REPLACE"时出现异常

我正在尝试对包含"REPLACE"函数的MS Access数据库执行SQL查询:

UPDATE MyTable 
   SET MyColumn = REPLACE(MyColumn, 'MyOldSubstring', 'MyNewSubstring') 
 WHERE Id = 10;
Run Code Online (Sandbox Code Playgroud)

如果我从MS Access(应用程序)内部运行此查询,它可以正常工作.但是当我尝试从我的应用程序运行它时会抛出异常.

例外:

System.Data.OleDb.OleDbException was unhandled
  Message="Undefined function 'REPLACE' in expression."
  Source="Microsoft Office Access Database Engine"
  ErrorCode=-2147217900
  StackTrace:
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
       at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
       at System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
       ...
Run Code Online (Sandbox Code Playgroud)

为什么我会得到这个例外?

更多信息:

  • 我的应用程序是WPF应用程序
  • 我正在使用.NET 3.5
  • 我运行MS Access 2007
  • 我的connectionstring是"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\ MyFolder\MyDatabase.accdb"

我的数据库访问代码看起来像这样,我只是将提到的SQL作为字符串传递:

public void ExecuteNonQuery(string sql)
{
    OleDbCommand command …
Run Code Online (Sandbox Code Playgroud)

.net ms-access replace

7
推荐指数
3
解决办法
1万
查看次数

为什么将AVG(intger_column)转换为DECIMAL至少返回六位小数?

考虑这个查询:

WITH Scores (score)
     AS
     (
      SELECT CAST(score AS INTEGER)
        FROM (
              VALUES (0), 
                     (10), 
                     (10)
             ) AS Scores (score)
     )
SELECT AVG(CAST(score AS DECIMAL(19, 8))) AS precision_eight, 
       AVG(CAST(score AS DECIMAL(19, 7))) AS precision_seven, 
       AVG(CAST(score AS DECIMAL(19, 6))) AS precision_six, 
       AVG(CAST(score AS DECIMAL(19, 5))) AS precision_five, 
       AVG(CAST(score AS DECIMAL(19, 4))) AS precision_four
  FROM Scores;
Run Code Online (Sandbox Code Playgroud)

结果:

precision_eight | precision_seven | precision_six | precision_five | precision_four 
     6.66666666 |       6.6666666 |      6.666666 |       6.666666 |       6.666666 
Run Code Online (Sandbox Code Playgroud)

为什么我总是得到至少六位小数?这是记录在案的行为?

(我正在运行SQL Server 2008)

sql sql-server sql-server-2008

6
推荐指数
1
解决办法
6183
查看次数

真的需要关系表吗?

关系表主要包含两列:IDTABLE1IDTABLE2.

只有关系表之间似乎有变化的是这两列的名称和表名.

它会更好,如果我们创建一个表Relationships,并在该表中,我们将3列:
TABLE_NAME,IDTABLE1,IDTABLE2,然后用这个表的所有关系?

这是Web /桌面应用程序开发中的一个好/可接受的解决方案吗?这有什么不利之处?

注意:
谢谢大家的反馈.我很感激.
但是,我认为你有点太过分了......每个解决方案都有效,直到有一点.
由于数据存储简单的文本文件在某一点上是好的,所以比MS Access更好,比SQL Server,比... ...
说实话,我还没有看到任何论据说明为什么这个解决方案对小项目不利(DB大小为几GB).

sql database

6
推荐指数
2
解决办法
763
查看次数

SQL如何搜索多对多的关系

我有两个主要的表的数据库noteslabels.它们具有多对多关系(类似于stackoverflow.com对标签的问题).我想知道的是如何使用SQL搜索使用多个标签的笔记?

例如,如果我有一个带有三个标签"one","two"和"three"的注释"test",我有第二个注释"test2",标签为"one"和"two",那么SQL查询将是什么找到与标签"一"和"两"相关的所有音符?

sql search many-to-many relational-division

5
推荐指数
1
解决办法
8374
查看次数

VB6在.NET WinForm上创建ocx?

我继承了一个VB6项目,它有一个带有VB控件的Form(Label等)和Windows Common控件(Treeview,ImageList等),它看起来像是一个用户控件的理想候选者.

我向同事提到了将其编译为在.NET WinForms项目中使用的ocx ActiveX控件的可能性.由于之前在C++项目中使用VB ocx的经验,他们有点惊骇:在原型设计阶段一切都很好但是当用于实际时有时间和刷新问题(对话框上的许多控件,控件之间的选项卡,停用然后激活对话框等).

有没有人有任何在.NET Windows窗体上使用VB6编写的ocx的经验?我可以期待微妙的问题,还是他们一起玩得很好?

.net vb6 ocx winforms

5
推荐指数
1
解决办法
1935
查看次数

CRYPT_GEN_RANDOM奇怪的效果

我想从一小部分整数(小于200)中随机选择一个值.作为替代

SELECT RAND()
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用

CAST(CAST(CRYPT_GEN_RANDOM(2) AS INTEGER) AS FLOAT) / 65535
Run Code Online (Sandbox Code Playgroud)

但是我得到了一些奇怪的效果.

例如:

WITH Numbers (num)
     AS
     (
      SELECT num
        FROM (
              VALUES (1), (2), (3), (4), 
                     (5), (6), (7), (8), 
                     (9), (10)
             ) AS Numbers (num)
     ), 
     RandomNumber (num)
     AS 
     (
      SELECT CAST(
                  (CAST(CAST(CRYPT_GEN_RANDOM(2) AS INTEGER) AS FLOAT) / 65535) 
                     * (SELECT COUNT(*) FROM Numbers) + 1 
                  AS INTEGER
                 )
     )
SELECT T1.num, R1.num
  FROM Numbers AS T1 
       INNER JOIN RandomNumber AS R1
          ON T1.num = R1.num;
Run Code Online (Sandbox Code Playgroud)

我希望这会返回一行,两列值相等.

但是,它返回零,一行或多行,列值仅偶尔相等. …

sql t-sql sql-server random sql-server-2008

5
推荐指数
1
解决办法
1338
查看次数