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

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

我正在通过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 [4004] (severity 16) [(null)] 
(SQL: select * from [tblLeistung])
我在MSSQLServerManagementStudio中执行了给定的SQL查询,结果很好。 我还尝试在ORM
protected$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。