Sql server 基于表中列的定义在存储过程中创建变量

Sql server 基于表中列的定义在存储过程中创建变量,sql-server,Sql Server,有没有办法使用表中的列定义来定义存储过程中的变量?例如,在Employees表中,有一个名为LastName的列。在INFORMATION_SCHEMA.COLUMNS中,您可以获得数据类型('nvarchar')和字符最大长度(50)。我想知道是否可以使用这两个描述符在存储过程中创建变量。我看到有人在甲骨文中使用了一种非常类似的技术。他们创建了一个表,并使用该定义声明了一个变量: CREATE TABLE TEST_CONSTANTS ( MAX_LEN VARCHAR2(32) );

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

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))

如果需要进一步澄清,请告诉我


蒂娅

没有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的文章了解其中的一些内容。

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