Sql server Laravel:生成的SQL仅在特定表上抛出错误
我正在通过Laravel,使用雄辩的ORM或查询生成器访问MS SQLServer。这在所有表上都可以正常工作,但有一个特定表会引发此错误:Sql server Laravel:生成的SQL仅在特定表上抛出错误,sql-server,sql-server-2008,laravel,Sql Server,Sql Server 2008,Laravel,我正在通过Laravel,使用雄辩的ORM或查询生成器访问MS SQLServer。这在所有表上都可以正常工作,但有一个特定表会引发此错误: production.ERROR: exception 'Illuminate\Database\QueryException' with message 'SQLSTATE [HY000]: General error: 4004 General SQL Server error: Check messages from the SQL Server
production.ERROR: exception 'Illuminate\Database\QueryException'
with message 'SQLSTATE [HY000]: General error: 4004 General SQL Server error:
Check messages from the SQL Server [4004] (severity 16) [(null)]
(SQL: select * from [tblLeistung])
我在MSSQLServerManagementStudio中执行了给定的SQL查询,结果很好。
我还尝试在ORMprotected$table='DBName.dbo.tblLeistung'中添加DB名称和模式名称正确生成(SQL:select*from[DBName].[dbo].[tblLeistung])
,但也会抛出相同的错误
问题似乎在于模式,因为它是一个相当大的表(23列,2160条记录)。删除它并使用相同的架构重新创建它仍然会导致错误。删除它并创建一个具有相同名称的简单表可以解决此错误(但是我需要使它与给定的模式一起工作)。
有人知道通过Laravel远程访问SQLServer是否不支持特定的表设计吗?
是否有其他(简单的)测试方法,无论是Laravel还是服务器的问题
我已经做了一段时间了,非常感谢你的帮助。提前谢谢
生成的问题表的CREATE TABLE
语句如下所示:
CREATE TABLE [dbo].[tblLeistung](
[LeistungID] [int] IDENTITY(1,1) NOT NULL,
[LeistungskatalogID] [int] NULL,
[SchlagID] [int] NOT NULL,
[StatusInternID] [int] NULL,
[StatusExternID] [int] NULL,
[VertragID] [int] NULL,
[Menge] [float] NULL DEFAULT ((0)),
[SperreLeistung] [bit] NULL DEFAULT ((0)),
[SperreAusfuehrung] [bit] NULL DEFAULT ((0)),
[RechnungEinkID] [int] NULL,
[RechnungVerkID] [int] NULL,
[LeistungsunterkatID] [int] NULL,
[LeistungsBeschreibung] [nvarchar](max) NULL,
[InterneNotiz] [nvarchar](max) NULL,
[AbrechungsdatenVorhanden] [bit] NULL DEFAULT ((0)),
[AuftragID] [smallint] NULL,
[UeberleistungID] [int] NULL,
[AuftraggeberID] [int] NULL,
[SSMA_TimeStamp] [timestamp] NOT NULL,
[DatumFrist] [datetime] NULL,
[DatumGeplant] [datetime] NULL,
[DatumAusgefuehrt] [datetime] NULL,
[DatumAuftragfreigabe] [datetime] NULL,
CONSTRAINT [tblLeistung$PrimaryKey] PRIMARY KEY CLUSTERED
(
[LeistungID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
ALTER TABLE [dbo].[tblLeistung] WITH NOCHECK ADD CONSTRAINT [tblLeistung$tbRechnungVerktblLeistung] FOREIGN KEY([RechnungVerkID])
REFERENCES [dbo].[tblRechnungVerk] ([RechnungVerkID])
ON UPDATE CASCADE
ALTER TABLE [dbo].[tblLeistung] CHECK CONSTRAINT [tblLeistung$tbRechnungVerktblLeistung]
编辑:
- 删除
外键
无法解决此问题
- 如果我访问一个不存在的表,也会发生同样的错误。但是,在使用不同配置在多个DB实例上创建了相同的表之后,我非常确信它是存在的
Laravel使用db库(如果可用)连接到无法从MSSQL接收unicode数据的Sql Server。(1,2)
如果不必将unicode数据保存在“LeistungsBeschreibung”中,请将列数据类型更改为varchar
您可能希望签出类似问题的已接受答案:
链接
- (一)
- (二)
请尝试:
$handle = getHandle();
$handle->exec('SET QUOTED_IDENTIFIER ON');
$handle->exec('SET ANSI_WARNINGS ON');
$handle->exec('SET ANSI_PADDING ON');
$handle->exec('SET ANSI_NULLS ON');
$handle->exec('SET CONCAT_NULL_YIELDS_NULL ON');
或
您还可以检查服务器配置:
检查“/etc/freetds.conf”文件,更改tds版本并添加客户端字符集,然后在php.ini中检查mssql.charset和default_字符集
在/etc/freetds.conf中:
;tds version = 4.2
tds version = 8.0
client charset = UTF-8
在php.ini中:
mssql.charset = "UTF-8"
default_charset = "utf-8"
谢谢。您必须在“LeistungsBeschreibung”中保存unicode数据吗?如果不尝试将数据类型更改为varchar.wow,那就太巧妙了-非常感谢!这似乎确实是问题所在。在“LeistungsBeschreibung”和“internetoniz”列中使用varchar重新创建表似乎可行。然而,简单地将数据插入到新的模式中就会产生转换错误(从nvarchar到datetime)。我得和DB管理员谈谈。那这就是我问题的答案吗?Laravel+MS SQL Server无法处理nvarchar(MAX)列中的unicode数据?是否有设置可以避免这种情况,并在不更改架构的情况下实现查询?使用VARCHAR(MAX)添加新列并在内部复制数据。您可以将此添加为答案@jithujose。但是,对于更改DB模式不是答案的情况,这不是答案。我发现了更多关于这个问题的信息(@2013-11-08/20:38)和。似乎没有解决任何问题。谢谢你的全面回答-这解决了这个特殊的问题。最终,由于Laravel+MS SQL Server的其他方面比较困难,我现在转而使用dreamfactory包装MS SQL Server,以提供带有JSON对象的RESTful API。