Sql server 通过ManagementStudio在脚本中使用EXISTS返回错误的值

Sql server 通过ManagementStudio在脚本中使用EXISTS返回错误的值,sql-server,sql-server-2008,ssms,exists,Sql Server,Sql Server 2008,Ssms,Exists,我对以下查询有问题 第1部分 更新表 第二部分 更改列名 如果我通过ManagementStudio重新运行脚本,我会得到一个错误 “permissiontype_id”列不存在 Exists中的Select语句显示正确的结果 我在脚本中的一些语句中出现了这样的错误,需要消除它们 第一句话 IF EXISTS ( SELECT 1 FROM sys.columns WHERE NAME = N'permissiontype_id' AND Object_I

我对以下查询有问题

第1部分

更新表

第二部分

更改列名

如果我通过ManagementStudio重新运行脚本,我会得到一个错误

“permissiontype_id”列不存在

Exists中的Select语句显示正确的结果

我在脚本中的一些语句中出现了这样的错误,需要消除它们

第一句话

IF EXISTS (
    SELECT 1
    FROM sys.columns
    WHERE NAME = N'permissiontype_id'
        AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]')
    )
BEGIN
UPDATE gptbl_user_permission
SET permissiontype_id = 1
WHERE objecttype_id = 'resultinfo'
END
GO
IF EXISTS (
    SELECT *
    FROM sys.columns
    WHERE NAME = N'permissiontype_id'
        AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]')
    )
BEGIN
ALTER TABLE [dbo].[gptbl_user_permission]

DROP CONSTRAINT PK_gptbl_user_permission

EXEC sp_rename '[dbo].[gptbl_user_permission].[permissiontype_id]'
    , 'permissiontype'
    , 'COLUMN';

ALTER TABLE [dbo].[gptbl_user_permission] ADD CONSTRAINT PK_gptbl_user_permission PRIMARY KEY CLUSTERED (
    [objecttype_id] ASC
    , [permissiontype] ASC
    , [user_id] ASC
    )
    WITH (
            PAD_INDEX = OFF
            , STATISTICS_NORECOMPUTE = OFF
            , IGNORE_DUP_KEY = OFF
            , ALLOW_ROW_LOCKS = ON
            , ALLOW_PAGE_LOCKS = ON
            )
END
GO
第二句话

IF EXISTS (
    SELECT 1
    FROM sys.columns
    WHERE NAME = N'permissiontype_id'
        AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]')
    )
BEGIN
UPDATE gptbl_user_permission
SET permissiontype_id = 1
WHERE objecttype_id = 'resultinfo'
END
GO
IF EXISTS (
    SELECT *
    FROM sys.columns
    WHERE NAME = N'permissiontype_id'
        AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]')
    )
BEGIN
ALTER TABLE [dbo].[gptbl_user_permission]

DROP CONSTRAINT PK_gptbl_user_permission

EXEC sp_rename '[dbo].[gptbl_user_permission].[permissiontype_id]'
    , 'permissiontype'
    , 'COLUMN';

ALTER TABLE [dbo].[gptbl_user_permission] ADD CONSTRAINT PK_gptbl_user_permission PRIMARY KEY CLUSTERED (
    [objecttype_id] ASC
    , [permissiontype] ASC
    , [user_id] ASC
    )
    WITH (
            PAD_INDEX = OFF
            , STATISTICS_NORECOMPUTE = OFF
            , IGNORE_DUP_KEY = OFF
            , ALLOW_ROW_LOCKS = ON
            , ALLOW_PAGE_LOCKS = ON
            )
END
GO

此错误是编译时错误,不是因为
存在而导致的。如果在第二次运行后运行
EXISTS
查询,它将不会返回任何内容

SELECT 1
FROM sys.columns
WHERE NAME = N'permissiontype_id'
    AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]')
因此,在运行时,控件在第一次运行后将永远不会到达您的
UPDATE

UPDATE gptbl_user_permission
SET permissiontype_id = 1
WHERE objecttype_id = 'resultinfo'
出现此错误的原因是,在初始运行后,SQL Server会检查查询的语法、此查询中涉及的表和列。此时,SQL Server知道没有列
permissiontype\u id
,并引发错误

解决方案

由于此错误是由于编译引起的,因此可以使用动态sql强制编译在运行时执行
UPDATE
,如下所示:

IF EXISTS (
    SELECT 1
    FROM sys.columns
    WHERE NAME = N'permissiontype_id'
        AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]')
    )
BEGIN
EXEC sp_executeSQL N'
UPDATE gptbl_user_permission
SET permissiontype_id = 1
WHERE objecttype_id = ''resultinfo'''
END
GO

由于
EXISTS
在第一次运行后每次都将返回false,因此动态
UPDATE
语句将永远不会被编译,也不会出现错误。

此错误是编译时错误,其原因不是
EXISTS
。如果在第二次运行后运行
EXISTS
查询,它将不会返回任何内容

SELECT 1
FROM sys.columns
WHERE NAME = N'permissiontype_id'
    AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]')
因此,在运行时,控件在第一次运行后将永远不会到达您的
UPDATE

UPDATE gptbl_user_permission
SET permissiontype_id = 1
WHERE objecttype_id = 'resultinfo'
出现此错误的原因是,在初始运行后,SQL Server会检查查询的语法、此查询中涉及的表和列。此时,SQL Server知道没有列
permissiontype\u id
,并引发错误

解决方案

由于此错误是由于编译引起的,因此可以使用动态sql强制编译在运行时执行
UPDATE
,如下所示:

IF EXISTS (
    SELECT 1
    FROM sys.columns
    WHERE NAME = N'permissiontype_id'
        AND Object_ID = Object_ID(N'[dbo].[gptbl_user_permission]')
    )
BEGIN
EXEC sp_executeSQL N'
UPDATE gptbl_user_permission
SET permissiontype_id = 1
WHERE objecttype_id = ''resultinfo'''
END
GO

由于
存在
在第一次运行后每次都会返回false,因此动态
更新
语句永远不会被编译,也不会出现错误。

如果我重新运行脚本
:如果你真的想
重新运行
,那么它应该会失败,因为该列已重命名为
permissiontype
,而不是
permissiontype\u id
。。脚本第一次运行时是否没有错误?你能给我们看看
gptbl\u user\u permission
的DDL吗?
如果我重新运行脚本
:如果你真的想
重新运行
,那么它应该失败,因为该列被重命名为
permissiontype
,而不是
permissiontype\u id
。。脚本第一次运行时是否没有错误?你能给我们看看
gptbl\u user\u permission
的DDL吗?
如果我重新运行脚本
:如果你真的想
重新运行
,那么它应该失败,因为该列被重命名为
permissiontype
,而不是
permissiontype\u id
。。脚本第一次运行时是否没有错误?你能给我们看一下
gptbl\u用户权限的DDL吗
?太好了。executeSQL解决了这一点。现在我将用这个重写我脚本的一些部分。谢谢=)@SteveFörster-几年前我收到了同样的问题<代码>如果存在
只能带你走到目前为止:)太好了。executeSQL解决了这一点。现在我将用这个重写我脚本的一些部分。谢谢=)@SteveFörster-几年前我收到了同样的问题<代码>如果存在只能带你走到目前为止:)太好了。executeSQL解决了这一点。现在我将用这个重写我脚本的一些部分。谢谢=)@SteveFörster-几年前我收到了同样的问题<代码>如果存在只能带您到目前为止:)