Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “不是你平常的样子。”;无法绑定多部分标识符";错误_Sql_Sql Server 2008 - Fatal编程技术网

Sql “不是你平常的样子。”;无法绑定多部分标识符";错误

Sql “不是你平常的样子。”;无法绑定多部分标识符";错误,sql,sql-server-2008,Sql,Sql Server 2008,我有下面的查询,现在奇怪的是,如果我在我的开发和pre-prod服务器上运行这个查询,它运行得很好。如果我在生产环境中运行它,它就会失败 我发现,如果我只运行Select语句,它会很高兴,但一旦我尝试插入表变量,它就会抱怨 DECLARE @RESULTS TABLE ( [Parent] VARCHAR(255) ,[client] VARCHAR(255) ,[ComponentName] VARCHAR(255) ,[DealName] VARCH

我有下面的查询,现在奇怪的是,如果我在我的开发和pre-prod服务器上运行这个查询,它运行得很好。如果我在生产环境中运行它,它就会失败

我发现,如果我只运行Select语句,它会很高兴,但一旦我尝试插入表变量,它就会抱怨

DECLARE @RESULTS TABLE
    (
     [Parent] VARCHAR(255)
    ,[client] VARCHAR(255)
    ,[ComponentName] VARCHAR(255)
    ,[DealName] VARCHAR(255)
    ,[Purchase Date] DATETIME
    ,[Start Date] DATETIME
    ,[End Date] DATETIME
    ,[Value] INT
    ,[Currency] VARCHAR(255)
    ,[Brand] VARCHAR(255)
    ,[Business Unit] VARCHAR(255)
    ,[Region] VARCHAR(255)
    ,[DealID] INT
    )

INSERT  INTO @RESULTS
SELECT DISTINCT
    ClientName 'Parent'
   ,F.ClientID 'client'
   ,ComponentName
   ,A.DealName
   ,CONVERT(SMALLDATETIME , ISNULL(PurchaseDate , '1900-01-01')) 'Purchase Date'
   ,CONVERT(SMALLDATETIME , ISNULL(StartDate , '1900-01-01')) 'Start Date'
   ,CONVERT(SMALLDATETIME , ISNULL(EndDate , '1900-01-01')) 'End Date'
   ,DealValue 'Value'
   ,D.Currency 'Currency'
   ,ShortBrand 'Brand'
   ,G.BU 'Business Unit'
   ,C.DMRegion 'Region'
   ,DealID
FROM
    LTCDB_admin_tbl_Deals A
    INNER JOIN dbo_DM_Brand B
    ON A.BrandID = B.ID
    INNER JOIN LTCDB_admin_tbl_DM_Region C
    ON A.Region = C.ID
    INNER JOIN LTCDB_admin_tbl_Currency D
    ON A.Currency = D.ID
    INNER JOIN LTCDB_admin_tbl_Deal_Clients E
    ON A.DealID = E.Deal_ID
    INNER JOIN LTCDB_admin_tbl_Clients F
    ON E.Client_ID = F.ClientID
    INNER JOIN LTCDB_admin_tbl_DM_BU G
    ON G.ID = A.BU
    INNER JOIN LTCDB_admin_tbl_Deal_Components H
    ON A.DealID = H.Deal_ID
    INNER JOIN LTCDB_admin_tbl_Components I
    ON I.ComponentID = H.Component_ID
WHERE
    EndDate != '1899-12-30T00:00:00.000'
    AND StartDate < EndDate
    AND B.ID IN ( 1 , 2 , 5 , 6 , 7 , 8 , 10 , 12 )
    AND C.SalesRegionID IN ( 1 , 3 , 4 , 11 , 16 )
    AND A.BU IN ( 1 , 2 , 3 , 4 , 5 , 6 , 8 , 9 , 11 , 12 , 15 , 16 , 19 , 20 , 22 , 23 , 24 , 26 , 28 , 30 )
    AND ClientID = 16128

SELECT ... FROM @Results
编辑-编辑-编辑-编辑-编辑-编辑-编辑 通过一个消除的过程,我发现了以下问题,并想知道是否有人能对此有所启发

  • 如果我只删除DISTINCT,那么查询运行正常,添加DISTINCT,就会出现奇怪的错误
  • 此外,我还发现,如果我对以下行进行注释,那么查询将使用DISTINCT运行。奇怪的是,表LTCDB_admin_tbl_Deal_组件中没有任何列被引用,因此我不知道DISTINCT将如何影响这一点

  • 有没有这些观点?我似乎记得在更改视图定义而不运行sp_refreshview之后,会出现类似这样的奇怪错误。我在任何地方都看不到文本“Tbl1021”,所以我假设这可能在视图定义中

    如果是这样,这里有一个脚本来刷新所有视图 如果不在我的开发系统上运行代码,我首先要解决的问题是代码中别名的使用不一致 您应该尽可能地识别对象{owner}作为良好的编码实践 例如,在本例中,使用相关别名A、B、C等作为每个对象的前缀

    例如,ClientName“Parent”将其设为A.ClientName“Parent” 如果此列在表中的别名为

    SELECT DISTINCT 
        ClientName 'Parent' 
       ,F.ClientID 'client' 
       ,ComponentName 
       ,A.DealName 
       ,CONVERT(SMALLDATETIME , ISNULL(PurchaseDate , '1900-01-01')) 'Purchase Date' 
       ,CONVERT(SMALLDATETIME , ISNULL(StartDate , '1900-01-01')) 'Start Date' 
       ,CONVERT(SMALLDATETIME , ISNULL(EndDate , '1900-01-01')) 'End Date' 
       ,DealValue 'Value' 
       ,D.Currency 'Currency' 
       ,ShortBrand 'Brand' 
       ,G.BU 'Business Unit' 
       ,C.DMRegion 'Region' 
       ,DealID 
    FROM 
        LTCDB_admin_tbl_Deals A 
    

    好的,我仍然不知道是什么原因造成的,或者正确的答案是什么,但是我最后做了些什么来修复它

  • 我创建了一个有问题的表的副本,并用数据的副本填充它
  • 我创建了所有相同的键、索引等
  • 测试查询并猜测它的工作原理 所以我备份了表中的数据,删除了有问题的表,用所有键、索引等重新创建了它,现在恢复了顺序


    以前失败的所有查询现在都能完美地工作。非常奇怪的

    数据错误-您是否尝试过复制prod数据库(或至少相关表)并在测试中运行它?您的字段是否足够宽,可以接收您插入的数据?没有,我将尝试并提供建议。ThanxOk在我继续之前只是对我刚刚尝试的内容进行了更新,这更奇怪。我想,如果是数据错误,让我们尝试一个不同的TOP 1,它起作用了,但是没有不同TOP 1的SELECT也会返回1行并起作用,但一旦我添加了DISTINCT,它就不起作用了。因此,在所有情况下,它都返回一行,但在某些情况下它工作,而在某些情况下它不工作。这些不是视图,它们是同义词,指向不同的服务器。现在,在所有人都说服务器之间的数据存在差异之前,请阅读我对这个问题的评论,关于它与DISTINCT有关,因为这是最奇怪的部分,SELECT总是返回一行,但如果我指定DISTINCT if,则会抛出错误。除此之外,这项工作一直持续到今天早上,我不知道有什么变化。所以基本上是什么导致了这个奇怪的错误嗯,我想也许可以用视图场景的缓存查询计划来解释。同义词的定义最近有变化吗?编辑-刚刚看到你说没有变化。我也同样感到困惑!看起来确实很奇怪。您连接到的服务器是所有SQL2008实例还是早期版本?你能用一个非常简单的查询来重现指向Tbl1021.ComponentName或Tbl1011.Currency的同义词吗?还是只有使用DISTINCT的复杂查询才会出现问题?好的,我尝试了以下方法:DECLARE@results TABLE(Currency VARCHAR(255))INSERT INTO@results SELECT DISTINCT[Currency]FROM[WILLOW]。[LTCDB].LTCDB_admin.tbl_Currency无问题我现在为不同的ClientID再次尝试,有29行带或不带distinct,但我一指定distinct,它就导致了一个错误
    INNER JOIN LTCDB_admin_tbl_Deal_Components H 
    ON A.DealID = H.Deal_ID
    
    SELECT DISTINCT 
        ClientName 'Parent' 
       ,F.ClientID 'client' 
       ,ComponentName 
       ,A.DealName 
       ,CONVERT(SMALLDATETIME , ISNULL(PurchaseDate , '1900-01-01')) 'Purchase Date' 
       ,CONVERT(SMALLDATETIME , ISNULL(StartDate , '1900-01-01')) 'Start Date' 
       ,CONVERT(SMALLDATETIME , ISNULL(EndDate , '1900-01-01')) 'End Date' 
       ,DealValue 'Value' 
       ,D.Currency 'Currency' 
       ,ShortBrand 'Brand' 
       ,G.BU 'Business Unit' 
       ,C.DMRegion 'Region' 
       ,DealID 
    FROM 
        LTCDB_admin_tbl_Deals A