Sql server 通过ManagementStudio在脚本中使用EXISTS返回错误的值
我对以下查询有问题 第1部分 更新表 第二部分 更改列名 如果我通过ManagementStudio重新运行脚本,我会得到一个错误 “permissiontype_id”列不存在 Exists中的Select语句显示正确的结果 我在脚本中的一些语句中出现了这样的错误,需要消除它们 第一句话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
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-几年前我收到了同样的问题<代码>如果存在只能带您到目前为止:)