【问题标题】:Why does this insert statement not match the table?为什么这个插入语句与表不匹配?
【发布时间】:2016-11-14 17:04:41
【问题描述】:

我正在使用 Visual Studio 2015 数据库项目尝试将行插入到项目创建的数据库表中。 Insert sql 在 SSMS 中的同一张表中工作,但在通过项目运行时不起作用。

我收到错误:Column name or number of supplied values does not match the table definition.

TSQL 插入脚本:

if not exists (select top 1 1 from [dbo].[PricingGroupTypes]) begin
    INSERT INTO [dbo].[PricingGroupTypes]
               ([Name])
         VALUES
               ('User')
               ,('Product Format')
    print 'Pricing Group Types added'
end

表定义(在数据库项目中):

CREATE TABLE [dbo].[PricingGroupTypes] (
    [Id]   INT            IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (250) NOT NULL,
    CONSTRAINT [PK_PricingGroupTypes] PRIMARY KEY CLUSTERED ([Id] ASC)
);

表定义(通过 ssms):

USE [Toyland]
GO

/****** Object:  Table [dbo].[PricingGroupTypes]    Script Date: 11/14/2016 11:05:05 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[PricingGroupTypes](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](250) NOT NULL,
 CONSTRAINT [PK_PricingGroupTypes] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

同一脚本中的其他插入似乎没有失败,但整个脚本会回滚,因此执行后数据库为空。而且,就像我说的,当我在 SQL Server Management Studio 中运行完全相同的脚本时,它可以工作。

也许我缺少一些 Visual Studio 设置,但这是整个项目中最直接的脚本部分,所以你可以看到我为什么感到困惑。

【问题讨论】:

  • 我认为这是其他一些插入语句,或者您在构建查询时在项目中放错了括号
  • 你的表有触发器吗?
  • @ChrisPratt 那应该给我两行。 ID 列是由数据库生成的,所以我只需要给出名称即可。
  • 听起来很像您正在插入您认为的不同表(不同的架构等),或者您的陈述不是您的想法。使用分析器查看您实际执行的操作可能会有所帮助。
  • 我会接受@JamesZ 的建议,即尝试使用分析器查看实际发生的情况 - 不幸的是,我看不出您的代码有任何问题。

标签: sql-server visual-studio tsql database-project


【解决方案1】:

最后,这里有一条评论表明这可能是项目生成的我的整个脚本的其他部分存在问题。事实证明是这样的。我现在已经解决了这个问题,原始问题中的代码没有改变。

不幸的是,我不知道大脚本的哪一部分是罪魁祸首,因为我必须经历并进行一些其他更改才能使一切顺利进行,但似乎没有任何问题使用我原来问题中的 SQL。

【讨论】:

    【解决方案2】:
    if not exists (select top 1 1 from [dbo].[PricingGroupTypes]) begin
        INSERT INTO [dbo].[PricingGroupTypes]
               ([Name])
             VALUES
               ('User')
               ,('Product Format')
        print 'Pricing Group Types added'
    end
    

    您的问题是您试图将两个值插入一列。尝试在 [Name] 中插入“用户”和“产品格式”将返回错误,因为它需要产品格式的目标。更新您的插入语句以包含第二列,它应该会去。

    【讨论】:

    • 我相信这是一次插入多行的有效语法。你把它和VALUES ('User', 'Product Format')混淆了。
    • 虽然可能是兼容性或 DB 级别设置可以将 VALUES ('User'),('Product Format') 解释为 VALUES ('User', 'Product Format'),但也许值得 OP 检查。
    • 这是一个 SQL Server 2012 Express 数据库。这应该是两行的好 SQL。另外,我提到如果我在 SSMS 环境中执行这个脚本,它会成功运行,但不是这个 Visual Studio 项目的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2017-08-04
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多