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