Sql server 能否将子查询结果用作转换类型?

Sql server 能否将子查询结果用作转换类型?,sql-server,Sql Server,我试图找到某个列的数据类型,并使用该数据类型将我正在硬编码的值(可能是1,因为这似乎是最灵活的)转换为该列的数据类型,该列将被动态插入。我正在从C#运行此SQL,但实体框架和存储过程当前不可用。我只需要知道是否可以使用系统表上的子查询(特别是sys.types)来动态选择要转换的数据类型 以下是我所拥有的: UPDATE TableName SET ColumnName = COALESCE( (SELECT TOP(1) ColumnName FROM TableName

我试图找到某个列的数据类型,并使用该数据类型将我正在硬编码的值(可能是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,则使用该值(因为我只是试图用特定于该类型的伪数据填充列中的NULL),否则搜索该列的类型并将值
1
转换为它


有什么见解吗?

我建议您构建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;

我尝试了一个本地表,它看起来不错。

您最好使用一个CASE语句,而不是在这里尝试使用cast。。。依赖于隐式转换。你必须使用动态sql来实现这一点……但这里有些东西很奇怪。为什么不管数据类型如何,都要使用1?此值适用于许多数据类型,但不是所有数据类型。uniqueidentifier之类的东西将引发异常,因为1无效。其他数据类型,如datetime,会给你一个结果,但它是无用的。@SeanLange我不是在寻找一个有用的结果,只是为了填充我正在查看的任何列的空值,它们都是int、varchar、decimal、bigint:convertible from int.pmbAustin你说得对,我可能会使用CASE语句;我只是想知道是否有更好的方法,用这样的占位符填充NULL有点奇怪。但只需使用“1”,它将隐式转换为这些数据类型。但请注意……如果您有具有该值的实际数据,您将无法知道您看到的“1”是由您的查询填充占位符值还是实际值造成的。当没有值时,NULL是适当的值。这就是NULL的含义。可能更好的解决方案是使用空字符串而不是1。对于大多数数据类型,SQL Server会将空字符串转换为“默认值”,例如''->INT->0;''->日期时间->01-01-1900;''->位->0等。当然,这并不适用于所有数据类型,尤其是较新的数据类型,如地理、uniqueidentifier等。