如何将列分配给动态变量

时间:2015-10-07 18:05:48

标签: sql sql-server oracle stored-procedures

我的数据库的一个表中的一列说(表A和列A)可以是数字类型或VARCHAR类型。动态决定数据类型,然后创建表。

我需要创建一个动态变量(@Dynamic),它应该检查该列的数据类型,并相应地为它分配一个不同的列(B列或C列),即

  • 如果列A是NVARCHAR,请将列B分配给@Dynamic
  • 如果A列为NUMERIC,请将C列指定给@Dynamic

我要在SQL Server和Oracle中执行此操作。

任何为此编写函数的帮助都将非常感激。

3 个答案:

答案 0 :(得分:1)

在sql server中,您可以检查列数据类型

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
      TABLE_NAME = 'Table A' 
  AND COLUMN_NAME = 'Column A'

在oracle中

SELECT Type
FROM user_tab_columns
WHERE table_name = 'Table A' 
  AND column_name = 'Column A';

答案 1 :(得分:1)

Sql_variant是SQL Server中的动态类型。 oracle中的等价是anydata类型。 但是,如果您使用动态SQL,为什么不将数据存储在nvarchar中,因为它对于convertet数值也足够大,您可以直接将它用于动态SQL语句?

答案 2 :(得分:0)

实际上这是一个通用问题,不需要任何样本数据来回答。

我遵循的方法是:

我写了一个函数

CREATE FUNCTION [dbo].[GET_DATA_TYPE] (@input VARCHAR)
  RETURNS VARCHAR(255) AS
BEGIN
  DECLARE @l_data_type VARCHAR(255)
  SELECT @l_data_type=DATA_TYPE 
     FROM INFORMATION_SCHEMA.COLUMNS
     WHERE 
     TABLE_NAME = @input AND 
     COLUMN_NAME = 'AssetID' 
  RETURN @l_data_type
END

我会在我的存储过程中将此函数称为

SELECT @dataType = dbo.GET_DATA_TYPE(@input);

我宣布另一个变量,即@FinalType

IF @dataType == 'numeric'
THEN @FinalType = columnC
IF @dataType == 'nvarchar'
THEN @FinalType = columnD

然后我将在所有动态sqls中使用此@FinalType变量。

任何其他有效的方法。