您可以将子查询结果用作转换类型吗?

时间:2017-08-28 18:32:47

标签: sql-server

我试图找到某个列的数据类型并使用它来将我正在硬编码的值(可能是1,因为它似乎是最灵活的)转换为列的数据类型被动态插入。我从C#运行此SQL,但实体框架和存储过程当前不可用。我只需要知道是否可以在系统表(特定于sys.types)上使用子查询来动态选择我转换为的数据类型。

这就是我所拥有的:

UPDATE TableName
SET ColumnName = 
COALESCE(
    (SELECT TOP(1) ColumnName
    FROM TableName
    Where TableName IS NOT NULL), 
    CAST(1 AS (SELECT t.name 
        FROM sys.types t 
        JOIN sys.columns c 
        ON c.user_type_id = t.user_type_id 
        WHERE c.object_id = Object_id('dbo.TableName') AND 
        c.name = 'ColumnName')))
WHERE ColumnName IS NULL

这样做的目的是,如果列中已经有一个非空的值,那就使用它(因为我只是试图填充列中的NULL,特殊于虚拟数据)该类型)以及以其他方式搜索该列的类型并将值1转换为它。

任何见解?

1 个答案:

答案 0 :(得分:0)

我建议您按以下方式构建Dinamic SQL:

DECLARE @SQL AS NVARCHAR(MAX);
SET @SQL = 'UPDATE TableName
SET ColumnName = 
COALESCE(
    (SELECT TOP(1) ColumnName
    FROM TableName
    Where TableName IS NOT NULL), 
    ' + 
        (SELECT t.name 
        FROM sys.types t 
        JOIN sys.columns c 
        ON c.user_type_id = t.user_type_id 
        WHERE c.object_id = Object_id('TableName ') AND 
        c.name = 'ColumnName') + '))
WHERE ColumnName IS NULL;'
PRINT @SQL; -- For debugging purposes
EXEC SP_ExecuteSQL @SQL;

我尝试过使用本地表,看起来不错。