将 sql_variant 转换为 varchar 以选择 left 2

jac*_*ack 2 sql-server type-conversion

我正在尝试填充服务包是否需要更新的列(版本状态)。我创建了一个查找表,其中列出了 SQL 版本和最新产品版本,例如 SQLVersion LatestSP SQL Server 2016 13.0.5026.0

然后,我有第二个表,其中包含产品版本,并希望将此值与 LatestSP 值进行比较,如果第一个表中的值小于第二个表中的值,则 SP 不是最新的。我需要指定两个表中的产品版本以 X 开头(即 SQL 2014 以 12 开头,SQL 2016 以 13 开头),然后比较数字(这样我只比较正确的版本),如果值Servers 中的值小于 SPLookup 中的值,然后使用“NEEDS UPDATING”填充 versionstatus 列。但是,我在将 sql_variant 转换为 varchar 以便能够选择前 2 位数字时遇到问题。

这是我到目前为止所拥有的,并将其推断到其他版本。Servers 表中的productversion 是sql_variant,SPLookup 中的LatestSP 是varchar。

 INSERT INTO Servers 
 (versionstatus)
 SELECT CASE WHEN LEFT(X.productversion, 2) = '12' AND LEFT(Y.LatestSP, 2) = '12' AND X.productversion < Y.LatestSP THEN 'UPDATE NEEDED' 
            WHEN LEFT(X.productversion, 2) = '12' AND LEFT(Y.LatestSP, 2) = '12' AND X.productversion >= Y.LatestSP THEN 'UP TO DATE'
        END AS versionstatus
        FROM Servers X INNER JOIN SPLookup Y ON X.productversion = Y.LatestSP 
Run Code Online (Sandbox Code Playgroud)

Sco*_*red 5

在应用该函数之前尝试将列显式转换sql_variant为。下面的简单例子对我有用。varcharLEFT

Declare @V sql_variant
set @v = '13.0.5026.0'
select left(convert(varchar(max),@v),2)
Run Code Online (Sandbox Code Playgroud)
| (No column name) |
|------------------|
| 13               |
Run Code Online (Sandbox Code Playgroud)