【问题标题】:Create a variable in a sproc based on definition of a column in a table根据表中列的定义在存储过程中创建变量
【发布时间】:2013-06-18 17:16:42
【问题描述】:

有没有办法使用表中的列定义来定义存储过程中的变量?例如,在表Employees 中有一个名为LastName 的列。在 INFORMATION_SCHEMA.COLUMNS 中,您可以获得 DATA_TYPE ('nvarchar') 和 CHARACTER_MAXIMUM_LENGTH (50)。我想知道是否可以使用这两个描述符在存储过程中创建一个变量。我看到有人在 Oracle 中使用的一种技术非常相似。他们创建了一个表并使用定义来声明一个变量:

CREATE TABLE TEST_CONSTANTS (
    MAX_LEN VARCHAR2(32)
);


DECLARE x TEST_CONSTANTS.MAX_LEN%TYPE;
BEGIN
    x := 'Test';
    dbms_output.put_line(x);
END;

我想做类似的事情。这样,如果表中的列发生更改,我可能不必更改我的代码(我也不想使用 varchar(max))。

如果需要进一步说明,请告诉我。

TIA!!

【问题讨论】:

  • 你需要动态 SQL 来做你想做的事
  • T-SQL 并不是真正适用于元编程的语言。您的全部目的只是为了声明一个有趣类型的变量,还是您有实际问题要解决?
  • 实际上,刚刚意识到您已经标记了 SQL-Server,但您的代码似乎不是 T-SQL。你标记错了吗?也许您的目标是甲骨文?
  • @Damien_The_Unbeliever 显然他想在 SQL Server 中做一些类似于 Oracle 代码正在做的事情
  • 我包含的代码是我在 Oracle 博客中找到的示例代码。我希望将它用作一种“数据字典”。在表中定义它,然后每当您必须创建与列匹配的变量时,您都可以“动态地”执行它。如果列更改(通常只有长度),您不必搜索所有代码以确保变量也已更改。

标签: sql-server


【解决方案1】:

没有基于列类型定义变量数据类型的 TSQL 语法。

原则上你可以使用用户定义的数据类型来做类似的事情,

CREATE TYPE [dbo].[EmployeeLastName] 
FROM [nvarchar](50) NOT NULL;

GO

CREATE TABLE [dbo].[Employee]
  (
     EmployeeId INT PRIMARY KEY,
     LastName   [dbo].[EmployeeLastName]  NOT NULL
  )

DECLARE @X [dbo].[EmployeeLastName] 

SET @X = 'Test' 

但在实践中,它们有各种限制,可能会让你失去这个想法。请参阅 Bart Duncan 的文章 T-SQL UDTs. (Huh!) What are they good for? 了解其中的一些内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多