【问题标题】:How to create type from existing table in SQL Server?如何从 SQL Server 中的现有表创建类型?
【发布时间】:2017-06-02 06:01:26
【问题描述】:

我有很多表已经存在的数据库。我需要编写存储过程来获取与其中一些表相同的数据并在存储过程中对其进行处理。

我知道可以根据类型创建表格。但是有时为了方便单个存储过程而添加新类型很麻烦。

有没有办法根据现有表定义类型内联?

有没有办法根据现有的表将其定义为存储过程参数?

【问题讨论】:

  • 你的意思是SELECT ... INTO ...?
  • 你能详细说明你使用“类型”这个词的意思吗?
  • 您可以右键单击表,选择“脚本表为...”>“创建到”>“新查询编辑器窗口”,然后更改脚本以创建用户定义的类型。
  • 是否要将表数据传递给存储过程?不需要通过参数传递整个表,可以将表名传递到存储过程中,然后使用动态语句执行脚本获取数据
  • 我确切地知道你想做什么以及为什么,但我不相信这是可能的。

标签: sql sql-server database tsql stored-procedures


【解决方案1】:

有没有办法根据现有表定义类型内联?

特征被称为:anchored data type,在 T-SQL 中没有直接的等价物。

锚定类型定义基于另一个 SQL 对象的数据类型,例如列、全局变量、SQL 变量、SQL 参数,或表或视图的行 >.

使用锚定类型定义定义的数据类型保持对它所锚定的对象的依赖关系。锚对象的数据类型的任何变化都会影响锚定的数据类型。如果锚定到表或视图的行,则锚定数据类型为 ROW,其字段由锚表或锚视图的列定义。

这种数据类型在声明变量时非常有用,因为您需要变量与另一个对象具有相同的数据类型

IBM DB2 和 Oracle DB 支持它。


替代方案:

将参数作为 XML/JSON 而不是表值参数传递。这将减轻程序维护类型的负担。

CREATE PROCEDURE my_proc @param XML -- instead of table type
AS
BEGIN
    -- here @param validation could be performed if needed

    SELECT s.c.value('col_name1', type_name) AS col_name1
          ,s.c.value('col_name2', type_name) AS col_name2
    INTO #tmp_param
    FROM @param p 
    CROSS APPLY p.nodes('...') s(c)

    SELECT *
    FROM #tmp_param;  -- any other use like normal table valued parameter
END

并称它为:

--Standard way
DECLARE @param table_type;
INSERT INTO @param(col1, col2) ...;
EXEC my_proc @param;

-- different way
DECLARE @param XML = (SELECT ... FROM ... FOR XML AUTO);
EXEC my_proc @param;

这里唯一的缺点是没有参数模式验证,并且必须在存储过程中执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2022-06-10
    • 2014-03-10
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多