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 VIEW是一个全局逻辑表,可以保留也可以不保留.但它仍然是一张桌子.因此,VIEW应该始终遵循第一范式(1NF)吗?即没有重复的行,只有标量类型,没有从上到下或从左到右的顺序等等.更高的正常形式呢?
对我来说,我的应用程序"消耗"存储过程的结果,我的VIEW被SQL查询"消耗",并且这两个用法是互斥的(即我不使用SQL查询存储过程的结果集,而我的应用程序不包含SQL代码).我见过其他人使用VIEW将列中的多个值"连接"成一行,通常是逗号分隔格式.在针对此类列的SQL查询中编写谓词需要类似于以下的kludges:
',' + concat_col + ',' LIKE '%' + ',' + search_value + ',' + '%'
Run Code Online (Sandbox Code Playgroud)
因此,我认为可以查询的所有表只包含标量类型似乎是合理的.想到这一点,我是否过于"纯粹主义"?
我有一个表'CompanyID int not null'的表,其默认值设置为10.现在我想编写一个查询,将此默认值更改为1.我怎么能这样做?
任何帮助将不胜感激.我正在使用SQL Server 2000.
我一直在讨论如何做这个问题,我知道这个网站上的一些天才会得到答案.基本上我正在尝试这样做:
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 :(
我正在尝试对包含"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)
为什么我会得到这个例外?
更多信息:
我的数据库访问代码看起来像这样,我只是将提到的SQL作为字符串传递:
public void ExecuteNonQuery(string sql)
{
OleDbCommand command …
Run Code Online (Sandbox Code Playgroud) 考虑这个查询:
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)
关系表主要包含两列:IDTABLE1
和IDTABLE2
.
只有关系表之间似乎有变化的是这两列的名称和表名.
它会更好,如果我们创建一个表Relationships
,并在该表中,我们将3列:
TABLE_NAME
,IDTABLE1
,IDTABLE2
,然后用这个表的所有关系?
这是Web /桌面应用程序开发中的一个好/可接受的解决方案吗?这有什么不利之处?
注意:
谢谢大家的反馈.我很感激.
但是,我认为你有点太过分了......每个解决方案都有效,直到有一点.
由于数据存储简单的文本文件在某一点上是好的,所以比MS Access更好,比SQL Server,比... ...
说实话,我还没有看到任何论据说明为什么这个解决方案对小项目不利(DB大小为几GB).
我有两个主要的表的数据库notes
和labels
.它们具有多对多关系(类似于stackoverflow.com对标签的问题).我想知道的是如何使用SQL搜索使用多个标签的笔记?
例如,如果我有一个带有三个标签"one","two"和"three"的注释"test",我有第二个注释"test2",标签为"one"和"two",那么SQL查询将是什么找到与标签"一"和"两"相关的所有音符?
我继承了一个VB6项目,它有一个带有VB控件的Form(Label等)和Windows Common控件(Treeview,ImageList等),它看起来像是一个用户控件的理想候选者.
我向同事提到了将其编译为在.NET WinForms项目中使用的ocx ActiveX控件的可能性.由于之前在C++项目中使用VB ocx的经验,他们有点惊骇:在原型设计阶段一切都很好但是当用于实际时有时间和刷新问题(对话框上的许多控件,控件之间的选项卡,停用然后激活对话框等).
有没有人有任何在.NET Windows窗体上使用VB6编写的ocx的经验?我可以期待微妙的问题,还是他们一起玩得很好?
我想从一小部分整数(小于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)
我希望这会返回一行,两列值相等.
但是,它返回零,一行或多行,列值仅偶尔相等. …