【问题标题】:SQL Store nvarchar(max) from temp table to sql_variantSQL Store nvarchar(max) 从临时表到 sql_variant
【发布时间】:2018-02-16 06:46:36
【问题描述】:

如何检查临时表中的列是否为 nvarchar(max),如果是,则将其转换或强制转换为 nvarchar(4000),以便将其存储在 sql_variant 中? 这是代码的一部分,其中@audit_oldvalue 是 sql_variant,而来自#tempTrigT 的@Item 是 nvarchar(max):

set @sql = 'select @audit_oldvalue=[' +@Item +'] from #tempTrigT';
EXEC SP_EXECUTESQL @sql,N'@audit_oldvalue sql_variant OUTPUT',@audit_oldvalue OUTPUT 

#tempTrigT:

Select * into #tempTrigT from (select * from deleted where @Action in ( 'U','D')) A UNION (select * from inserted where @Action ='I') 

【问题讨论】:

    标签: sql tsql sql-server-2012 triggers type-conversion


    【解决方案1】:

    只需将 NVARCHAR(MAX) 转换为 NVARCHAR(4000),然后再转换为 SQL_VARIANT。

    DECLARE @String NVARCHAR(MAX) = N'test string';
    
    SELECT CAST(@String AS SQL_VARIANT);                            --fail
    SELECT CAST(CAST(@String AS NVARCHAR(4000)) AS SQL_VARIANT);    -- success
    

    【讨论】:

    • 你能把它修改成我的代码吗?因为我不能。并且是否可以先检查它的 NVARCHAR(MAX) 是否然后进行转换,否则保持原样?
    【解决方案2】:
    set @sql = 'set @audit_oldvalue=(select cast([' +@Item +'] as NVARCHAR(4000)) from #tempTrigT)';
    EXEC SP_EXECUTESQL @sql,N'@audit_oldvalue sql_variant OUTPUT',@audit_oldvalue OUTPUT
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多