【问题标题】:How to assign a column to a dynamic variable如何将列分配给动态变量
【发布时间】:2015-10-08 05:09:21
【问题描述】:

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

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

  • 如果 A 列是 NVARCHAR,则将 B 列分配给 @Dynamic
  • 如果 A 列是 NUMERIC,则将 C 列分配给 @Dynamic

我必须在 SQL Server 和 Oracle 中都这样做。

任何为此编写函数的帮助将不胜感激。

【问题讨论】:

  • 下次尝试为SqlFiddle 提供架构和一些数据,以便我们更好地理解问题并更快地给您答案——也请阅读How to askHow to create a Minimal, Complete, and Verifiable example.跨度>
  • 您要指定列名还是列数据?
  • 我想分配列名,以便我可以在另一个动态 sql 中使用该动态变量
  • 你能添加更多关于你必须做什么的细节吗?就目前而言,我很难理解你最终想要做什么。此外,这感觉可能是一个 XY 问题,并且可能有一个更简单的整体解决方案来满足您的需求。

标签: sql sql-server oracle stored-procedures


【解决方案1】:

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

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

在甲骨文中

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      其实这是一个笼统的问题,不需要任何样本数据来回答。

      我遵循的方法是:

      我写了一个函数

      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
      

      然后我将在我所有的动态 sql 中使用这个 @FinalType 变量。

      任何其他有效的方法来做到这一点。

      【讨论】:

      • 这与我使用的方法相同。我也有 Oracle 的基本解决方案语法。
      • @JuanCarlosOropeza 感谢您的意见。是的,我也会对 Oracle 采用相同的方法。
      • 现在我想知道在提问之前你是否有这个解决方案?因为这些信息对理解问题有很大帮助。
      • 不,我在收到您的意见后最终确定了这个解决方案。
      • 所以请考虑接受我的答案作为正确答案还是赞成?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      相关资源
      最近更新 更多