我使用Eloquent ORM或Query Builder通过Laravel访问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 [4004] (severity 16) [(null)]
(SQL: select * from [tblLeistung])
我在MS SQLServer Management Studio中执行了给定的SQL查询,它运行正常。
我还尝试在ORM protected $table = 'DBName.dbo.tblLeistung';
中添加数据库名称和模式名称,它正确生成(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]
编辑:
FOREIGN KEY
并未解决问题答案 0 :(得分:2)
Laravel使用db-library(如果可用)连接到无法从MSSQL接收unicode数据的Sql Server。 (1,2)
如果您不必在'LeistungsBeschreibung'中保存unicode数据,请将列数据类型更改为varchar。
您可能想要查看类似问题的已接受答案: MSSQL Query issue in PHP and querying text data
<强>链接强>
答案 1 :(得分:0)
请尝试:
$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');
OR
您还可以检查服务器配置: 检查&#34; /etc/freetds.conf"文件并更改tds版本并添加客户端字符集然后在php.ini中请检查mssql.charset和default_charset
/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"
感谢。