Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 为什么我只在某些情况下得到“字符串或二进制数据将被截断”?_Sql Server - Fatal编程技术网

Sql server 为什么我只在某些情况下得到“字符串或二进制数据将被截断”?

Sql server 为什么我只在某些情况下得到“字符串或二进制数据将被截断”?,sql-server,Sql Server,我正在排除SQL Server错误消息8152的问题。只有在某些情况下,字符串或二进制数据才会被截断。 下面的查询与抛出错误的查询类似 CREATE TABLE SourceValues ( SourceId INT IDENTITY (1,1), SourceValue VARCHAR(3) ) GO INSERT INTO SourceValues (SourceValue) VALUES ('aaa') INSERT INTO SourceValues (SourceVal

我正在排除SQL Server错误消息8152的问题。只有在某些情况下,字符串或二进制数据才会被截断。 下面的查询与抛出错误的查询类似

CREATE TABLE SourceValues (
    SourceId INT IDENTITY (1,1),
    SourceValue VARCHAR(3)
)
GO
INSERT INTO SourceValues (SourceValue) VALUES ('aaa')
INSERT INTO SourceValues (SourceValue) VALUES ('aab')
INSERT INTO SourceValues (SourceValue) VALUES ('aa')
INSERT INTO SourceValues (SourceValue) VALUES ('ab')
INSERT INTO SourceValues (SourceValue) VALUES ('a')
INSERT INTO SourceValues (SourceValue) VALUES ('b')
GO

PRINT 'NOT WORKING #1'
CREATE TABLE TargetValues (TargetValue VARCHAR(2))
INSERT INTO TargetValues (TargetValue) 
SELECT s1.SourceValue
FROM SourceValues s1, SourceValues s2
WHERE s1.SourceId=s2.SourceId+1 AND s1.SourceValue!='aab'
DROP TABLE TargetValues
GO

PRINT 'NOT WORKING #2'
CREATE TABLE TargetValues (TargetValue VARCHAR(2))
INSERT INTO TargetValues (TargetValue) 
SELECT s1.SourceValue
FROM SourceValues s1, SourceValues s2
WHERE s1.SourceId=s2.SourceId+1 AND s1.SourceValue!='aab'
ORDER BY s1.SourceValue
DROP TABLE TargetValues
GO

PRINT 'WORKING #1'
CREATE TABLE TargetValues (TargetValue VARCHAR(2))
INSERT INTO TargetValues (TargetValue) 
SELECT s1.SourceValue
FROM SourceValues s1, SourceValues s2
WHERE s1.SourceId=s2.SourceId+1 AND s1.SourceValue!='aab'
ORDER BY s2.SourceValue -- <-- using s2 instead of s1 for order
DROP TABLE TargetValues
GO

PRINT 'WORKING #2'
CREATE TABLE TargetValues (TargetId INT IDENTITY (1,1),TargetValue VARCHAR(2)) -- <-- using identity column
INSERT INTO TargetValues (TargetValue) 
SELECT s1.SourceValue 
FROM SourceValues s1, SourceValues s2 
WHERE s1.SourceId=s2.SourceId+1 AND s1.SourceValue!='aab'
DROP TABLE TargetValues
GO

DROP TABLE SourceValues
问题出现在查询“NOT WORKING 1”中,其他问题是关于解决方案的一些想法。 有人知道非工作查询和工作查询之间的区别吗

我在SQLServer2005、SQLServer2008和SQLServer2008R2上进行了测试,得到了相同的结果。但我听说所有查询在另一个SQLServer2008R2实例上都失败了


另外,请注意,我已通过将TargetValues表中的varchar设置为3的大小来解决此问题。更正了错误。

如果我是对的,请尝试将“aaa”添加到varchar2字段。这是不可能的,因为数据将被截断。

此时数据将溢出字段的长度,如abc到char2

CREATE TABLE SourceValues (
    SourceId INT IDENTITY (1,1),
    SourceValue VARCHAR(3)
)
GO
INSERT INTO SourceValues (SourceValue) VALUES ('aaa')
INSERT INTO SourceValues (SourceValue) VALUES ('aab')
INSERT INTO SourceValues (SourceValue) VALUES ('aa')
INSERT INTO SourceValues (SourceValue) VALUES ('ab')
INSERT INTO SourceValues (SourceValue) VALUES ('a')
INSERT INTO SourceValues (SourceValue) VALUES ('b')
GO

PRINT 'NOT WORKING #1'
CREATE TABLE TargetValues (TargetValue VARCHAR(2))
INSERT INTO TargetValues (TargetValue) 
SELECT s1.SourceValue
FROM SourceValues s1, SourceValues s2
WHERE s1.SourceId=s2.SourceId+1 AND s1.SourceValue!='aab'
DROP TABLE TargetValues
GO

PRINT 'NOT WORKING #2'
CREATE TABLE TargetValues (TargetValue VARCHAR(2))
INSERT INTO TargetValues (TargetValue) 
SELECT s1.SourceValue
FROM SourceValues s1, SourceValues s2
WHERE s1.SourceId=s2.SourceId+1 AND s1.SourceValue!='aab'
ORDER BY s1.SourceValue
DROP TABLE TargetValues
GO

PRINT 'WORKING #1'
CREATE TABLE TargetValues (TargetValue VARCHAR(2))
INSERT INTO TargetValues (TargetValue) 
SELECT s1.SourceValue
FROM SourceValues s1, SourceValues s2
WHERE s1.SourceId=s2.SourceId+1 AND s1.SourceValue!='aab'
ORDER BY s2.SourceValue -- <-- using s2 instead of s1 for order
DROP TABLE TargetValues
GO

PRINT 'WORKING #2'
CREATE TABLE TargetValues (TargetId INT IDENTITY (1,1),TargetValue VARCHAR(2)) -- <-- using identity column
INSERT INTO TargetValues (TargetValue) 
SELECT s1.SourceValue 
FROM SourceValues s1, SourceValues s2 
WHERE s1.SourceId=s2.SourceId+1 AND s1.SourceValue!='aab'
DROP TABLE TargetValues
GO

DROP TABLE SourceValues
您的源数据中有aaa

它不能关闭或自动截断

看更多你可能想知道的

编辑:

这是一种奇怪的行为

这仍然会因显式联接而失败,并中断其中一个工作查询

选择s1.SourceValue 从SourceValues s1连接s1上的SourceValues s2。SourceId=s2。SourceId+1 其中s1.SourceValue'aab' 按s2.SourceValue、s1.SourceValue排序


我在MS Connect上找不到与此相关的任何内容

SQL server知道模式不同。尽管有where子句,您仍然在最终将VARCHAR3列选择到VARCHAR2接收列中。将结果select强制转换/转换为varchar2,它将正常工作。将结果类型像这样链接到where子句可能不是最佳做法——where子句可能会在以后某个日期返回一个3个字母的列,这当然取决于您的数据,它会破坏它,但select中的显式强制转换/转换将解决此特定问题

我认为,如果您将ANSI_警告设置为OFF,它将静默地允许插入和截断value@AdaTheDev:正确,但您会破坏索引视图、链接服务器等。长期而言,这不是一个受支持的选项是的,同意。我只是想澄清一下,我并不建议关掉它:对不起,但我知道问题出在哪里。我想知道发生错误的原因,因为我只插入两个字符的数据,aaa由join消除,aab由where消除condition@woni:我现在看到了,可以在SQL Server 2008和SQL Server 2005上复制。好问题。不,没有插入aaa。它被join消除。