我使用sql server 2014。
我有几个存储过程,一个用于删除列表另一个用于添加列表。 以下是删除列的代码。 这是删除任何表中任何列的通用过程。
@Column和@Table是存储过程的输入
我能找到执行语句的唯一方法是定义一个包含要执行的sql指令的tsql字符串,并将表名和列名添加到命令中。
DECLARE @tsql varchar (MAX)
SET @tsql = 'ALTER TABLE [dbo].['+@Table+'] DROP COLUMN ' + @Column
EXECUTE(@tsql)
如果发生错误,我想返回-1,否则如下:
if @@ERROR <> 0
BEGIN
RETURN(-1)
END
ELSE
BEGIN
RETURN(2)
END
如果在执行
时出现问题,如何捕获错误 EXECUTE(@tsql)
我尝试使用@@ ERROR,但执行过程没有发现错误。
作为替代方案,如果我试图删除不存在的列,那么检查列是否存在的方法是什么?
运行存储过程我添加以下结果:错误4924“ALTER TABLE DROP COLUMN失败,因为表'part'中不存在列'bla'。”
此外,我想返回一个标志以确认更改(如果有)。
ALTER PROCEDURE [dbo].[DropColumn]
-- Add the parameters for the stored procedure here
@Table varchar(MAX)=NULL,
@Column varchar(MAX)=NULL,
@ColumnModified int OUTPUT
AS
BEGIN TRY
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
Set @ColumnModified=0
IF (@Table) IS NULL GOTO Help
IF (@Column) IS NULL GOTO Help
-- Insert statements for procedure here
DECLARE @tsql varchar (MAX)
SET @tsql = 'ALTER TABLE [dbo].['+@Table+'] DROP COLUMN ' + @Column
EXECUTE(@tsql)
if @@ERROR <> 0
BEGIN
RETURN(-1)
END
ELSE
BEGIN
RETURN(2)
END
Help:
PRINT 'DropColumn'
PRINT CHAR(13)
PRINT 'usage:'
PRINT CHAR(13)
PRINT '@Table '
PRINT CHAR(13)
PRINT '@Column '
PRINT CHAR(13)
PRINT 'output @ColumnModified '
PRINT CHAR(13)
RETURN(-1)
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_MESSAGE() AS ErrorMessage;
RETURN(-1)
END CATCH
这里的帖子How to check if a column exists in SQL Server table是对我的问题的部分和非直接的答案,因为它是特定的表和列所特有的。 而不是tableName的字符串valyue我有一个变量(对于columnName是相同的)。 如何使用@Column和@Table移植以下代码?
IF COL_LENGTH('schemaName.tableName', 'columnName') IS NOT NULL
BEGIN
-- Column Exists
END
答案 0 :(得分:1)
不确定您的问题&#34;是可重复的,但我已经确认TRY CATCH块可以工作:
BEGIN TRY
DECLARE @sql nvarchar(max);
SET @sql = 'ALTER TABLE [dbo].[SomeTable] DROP COLUMN NonExistentColumn'
EXECUTE(@sql);
END TRY
BEGIN CATCH
SELECT @@ERROR
END CATCH
此代码为我返回4924。哪个不是0。