【问题标题】:T-Sql Stored Procedure to Dynamically Add a Column to a Table Based on Parameters [duplicate]T-Sql存储过程根据参数动态向表中添加列[重复]
【发布时间】:2012-12-19 00:57:25
【问题描述】:

可能重复:
ALTER TABLE my_table ADD @column INT

谁能告诉我是否有可能有一个有效的存储过程:

USE [dbname]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [Schema].[CreateColumn]
    @Table varchar(255),
    @ColumnName varchar(255)
AS
BEGIN
    BEGIN TRANSACTION
        SET QUOTED_IDENTIFIER ON
        SET ARITHABORT ON
        SET NUMERIC_ROUNDABORT OFF
        SET CONCAT_NULL_YIELDS_NULL ON
        SET ANSI_NULLS ON
        SET ANSI_PADDING ON
        SET ANSI_WARNINGS ON
    COMMIT

    BEGIN TRANSACTION
        ALTER TABLE [Schema].@Table ADD @ColumnName varchar(255) NULL
        ALTER TABLE [Schema].@Table SET (LOCK_ESCALATION = TABLE)
    COMMIT
END
GO

基本上,我可以传入一个表名和列名,然后它会使用适当的事务在该表上创建它。

【问题讨论】:

标签: sql-server tsql stored-procedures


【解决方案1】:

对不起,这是不可能的。请参阅此网站。

对不起,那不是真的。

但是,它很笨拙。您几乎可以简单地执行内联 SQL(如果是表单客户端代码)或简单地编写一个 SQL 语句,因为您每次都需要定义表名、列名、列数据类型和默认值你执行(除非你硬编码其中的一些参数,即列数据类型总是 VarChar(255)。

在这方面尝试各种变化,看看你是否找到了你正在寻找的东西。但是,可能有更好的方法来实现您想要做的事情:

DECLARE @sql NChar(4000);

SET @Sql = N'ALTER TABLE [Schema].' 
    + @TableName + ' ADD ' 
    + @ColumnName + ' ' 
    + @ColumnType + ' ' 
    + @InitialValue

EXECUTE sp_executesql @sql
GO

【讨论】:

  • 不可能按照 OP 的要求去做,而不是使用动态 SQL。
【解决方案2】:

对不起,这是不可能的。见this website

【讨论】:

  • 您在技术上是对的,我想在没有动态 SQL 的情况下这样做,但现在我知道我做不到。
猜你喜欢
  • 2019-03-17
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 2020-07-09
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多