Laravel:生成的SQL仅在特定表上抛出错误

时间:2014-05-27 18:59:53

标签: sql-server sql-server-2008 laravel

我使用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并未解决问题
  • 如果我访问不存在的表,则会发生同样的错误。但是,在使用不同配置的多个数据库实例上创建相同的表后,我非常有信心它存在。

2 个答案:

答案 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"

感谢。