tsql:tsql联合更新转换的访问查询正确吗?

tsql:tsql联合更新转换的访问查询正确吗?,tsql,union,Tsql,Union,我在access中有一个查询,需要将其转换为sql server 2005中的存储过程。 access中的查询如下所示: UPDATE tblitem, tblFileSignature SET tblitem.strFileProcesstype = [tblFileSignature].[STRFILEPROCESSTYPE], tblitem.strFileSignatureType = [tblFileSignature].[strfilesignaturetype] WHERE

我在access中有一个查询,需要将其转换为sql server 2005中的存储过程。
access中的查询如下所示:

UPDATE 
tblitem, 
tblFileSignature 
SET 
tblitem.strFileProcesstype = [tblFileSignature].[STRFILEPROCESSTYPE], tblitem.strFileSignatureType = [tblFileSignature].[strfilesignaturetype]
WHERE 
(((tblitem.strFileSignatureType) Is Null) AND 
((tblitem.strFileExclude)="n") AND 
((InStr([tblitem].[strfilesignature],[tblFileSignature].[strsignature]))=1) AND ((tblitem.uidItemType)=1 Or (tblitem.uidItemType)=5) AND 
((tblitem.uidCollection)=[forms]![frmSetup]![txtInputCol]) AND ((tblitem.strFileSignature) Not Like "d0c*") AND 
((tblFileSignature.strFileProcessType) Not Like "ZIP"));
在tsql中。。这是一样的吗

update tblItem 
set 
i.strFileProcesstype = f.strFileProcesstype,
i.strFileSignatureType = f.strfilesignaturetype 

from tblItem as I UNION tblFileSignature as F 

WHERE (((i.strFileSignatureType) Is Null) AND 
((i.strFileExclude)="n") AND 
((i.[strfilesignature] like F.strsignature)) AND 
((i.uidItemType)=1 Or 
(i.uidItemType)=5) AND 
((i.uidCollection)=@inputcolumn AND 
((i.strFileSignature) Not Like 'd0c%') AND 
((F.strFileProcessType) Not Like 'ZIP'));
提前谢谢

更新:

因此,我将采用以下方法。如果我取消对declare和select子句的注释,并从declare向下执行,它就会运行;如果我对declare和select部分进行注释,它会在“;”附近显示error

UPDATE I  
SET 
    I.strFileProcesstype = F.STRFILEPROCESSTYPE, 
    I.strFileSignatureType = F.strfilesignaturetype
--declare @uidcollectionID int
--select I.strFileSignatureType
from 
tblItem I
    inner join tblFileSignature F
on 
I.strfilesignature = left(F.strsignature,len(I.strfilesignature))

WHERE I.strFileSignatureType Is Null 
    AND I.strFileExclude='n' 
    AND I.uidItemType in (1,5) 
    AND I.uidCollection = @uidCollectionID
    AND left(I.strFileSignature,3) <> 'd0c' 
    AND F.strFileProcessType <> 'ZIP';
更新I
设置
I.strFileProcesstype=F.strFileProcesstype,
I.strFileSignatureType=F.strFileSignatureType
--声明@uidcollectionID int
--选择I.strFileSignatureType
从…起
tblItem I
内连接TBLFILEF签名
在…上
I.strfilesignature=左(F.strsignature,len(I.strfilesignature))
其中I.strFileSignatureType为Null
和I.strFileExclude='n'
和I.uidItemType in(1,5)
和I.uidCollection=@uidCollectionID
左(I.strFileSignature,3)“d0c”
和F.strFileProcessType'ZIP';

有什么想法吗?

您应该更改

  • 双引号
    单引号
  • *
    %
  • 用类似的
    替换
    仪表

除此之外,我觉得还可以。

不,你应该使用连接,而不是联合

可以将其设置为交叉联接,并继续应用WHERE子句中的联接条件,也可以将其设置为内部联接:

from tblItem as I INNER JOIN tblFileSignature as F 
ON ((InStr(i.[strfilesignature],F.[strsignature]))=1)

并从WHERE子句中删除该条件(Lieven的答案也适用)。

这应该接近您需要的条件。可能需要在连接条件下工作,但我认为我从INSTR的转换就可以了

UPDATE i
    SET strFileProcesstype = fs.STRFILEPROCESSTYPE, 
        strFileSignatureType = fs.strfilesignaturetype
    FROM tblitem i
        INNER JOIN tblFileSignature fs
            ON i.strfilesignature = LEFT(fs.strsignature, LEN(i.strfilesignature))
    WHERE i.strFileSignatureType IS Null 
        AND i.strFileExclude='n' 
        AND i.uidItemType IN (1,5)
        AND i.uidCollection = @inputcolumn 
        AND LEFT(i.strFileSignature,3) <> 'd0c' 
        AND fs.strFileProcessType <> 'ZIP';
更新i
设置strFileProcesstype=fs.strFileProcesstype,
strFileSignatureType=fs.strFileSignatureType
来自tblitem i
内部连接TBLFILEFS签名
ON i.strfilesignature=左(fs.strsignature,LEN(i.strfilesignature))
其中i.strFileSignatureType为Null
和i.strFileExclude='n'
和i.uidItemType IN(1,5)
和i.uidCollection=@inputcolumn
左(i.strFileSignature,3)“d0c”
和fs.strFileProcessType'ZIP';

我一直收到一个错误,在“ZIP”附近说“语法不正确”很难远程诊断。我觉得我的语法很好。如果你去掉分号会有什么区别吗?那没有分号。如果我加上分号,它在“;”附近会说不正确的语法如果我将declare@inputcolumn select*添加到from子句中,并突出显示其余部分。。它告诉我多部分标识符i.strFileSignaturetype“无法绑定…与strFileExclude、uidItemtype和where子句中的其他项相同。如果我在没有where子句的情况下执行select,则select调整将正常执行