Sql server 是否有创建表或创建过程自动确定SSMS中的列类型?

Sql server 是否有创建表或创建过程自动确定SSMS中的列类型?,sql-server,tsql,ssms,Sql Server,Tsql,Ssms,我有一个数据库创建脚本,用于设置表、存储过程、视图等。当我更改create table语句中列的类型时,我希望此更改反映在引用该表的create存储过程/views/etc语句中,而无需遍历并手动更改每个表 换句话说,我希望存储过程在创建时根据另一列的类型自动确定列类型。我不需要在有数据的实时数据库上工作,就在我迭代设计和原型时 在这个虚构的例子中,类似于某种类型的: create table Logs ( id int identity(1, 1) prima

我有一个数据库创建脚本,用于设置表、存储过程、视图等。当我更改create table语句中列的类型时,我希望此更改反映在引用该表的create存储过程/views/etc语句中,而无需遍历并手动更改每个表

换句话说,我希望存储过程在创建时根据另一列的类型自动确定列类型。我不需要在有数据的实时数据库上工作,就在我迭代设计和原型时

在这个虚构的例子中,类似于某种类型的:

create table Logs
(
    id              int identity(1, 1) primary key,
    userName        varchar(32),
    logType         int foreign key references LogType(id),
    description     varchar(128),
    datestamp       datetime
);
go

create procedure WriteLog
(
    @userName       TYPE_OF(Logs.userName),   -- should be varchar(32),
    @logType        int,
    @description    TYPE_OF(Logs.description)    -- should be varchar(128)
)
as
begin

    insert into Logs
    values(@userName, @logType, @description, SYSDATETIME());

end
go;
我想我还记得Oracle/SQL Plus/PLSQL中类似的东西,但我很难找到它


我使用的是SQL Server Management Studio v18.4,不确定您要查找的功能类型是否存在,但您可以尝试使用一个来保持过程与列类型更改同步

每次更改表时都会触发此触发器,您只需解析EVENTDATA即可查看Logs表中的列类型是否已更改。你的触发器的主体看起来像这样:

CREATE TRIGGER OnLogsChanged
ON DATABASE
FOR ALTER_TABLE
AS
BEGIN
    -- 1. Parse EVENTDATA() to see if the Logs table was altered

    -- 2. If it has, store the definition of the WriteLog procedure into a variable by reading it from sys.procedures

    -- 3. Read the new types for the columns of the Logs table from sys.all_columns

    -- 4. replace the parameter declarations in the procedure definition to match the new types in the Logs table

    -- 5. alter the procedure with the new definition by building up the ALTER PROCEDURE statement as a string and executing it with sp_executesql
END

只要触发器保持启用状态,您的过程就应该与表列类型保持同步。

不,没有这样的事情。您必须手动更新所有依赖项。您可以从中探索运行结果。我怀疑有很多gotcha可以找到,这确实是我想要的,但它增加了每次我想要更改新dbo时编写触发器和alter语句的复杂性。它确实可以保留数据,但我也可以编辑create语句;并重新生成整个数据库,如果测试数据不是很大,在大多数情况下可能会更快。我想你是对的,我想要的东西并不存在。