另一个“转换失败时将varchar值'NA'转换为数据类型int。”

时间:2015-03-10 22:47:32

标签: sql-server tsql

CTEI有一个运行表值函数的查询,我重复使用它来交叉连接到另一个表。它在两种情况下都工作正常,直到我决定在函数中添加2个新参数。第一种情况正常,但第二种情况不起作用,我得到“转换失败时将varchar值'NA'转换为数据类型int。”造成这种情况的原因是什么?

;WITH CTE AS (
    SELECT Char4X, Y FROM TableA WHERE Char4X = '2.01'
)
SELECT f.*, a.* 
FROM dbo.UDF_Function1('2014-03-01', '2015-03-01', NULL, 'ABCDE', NULL, NULL) f
CROSS JOIN CTE a

我是否使用CTE是同样的错误。我的数据库中的任何列中的任何表都没有'NA'值我知道该函数有很多层,如在视图和过滤中进行,所以我不能100%确定我是否需要集中精力这里。无论如何,下划线功能不会转换或转换为INT。该函数在没有交叉连接的情况下可以自行运行。前两个参数是datetime,其余参数都是varchar并允许空值。

1 个答案:

答案 0 :(得分:0)

好的谁是假人?当然是我。如果其他人有同样的问题“永远不会假设”,那么它是值得的。我运行了以下查询以查看是否有任何列包含'NA'和低,并且看到我发现了一些。我将发布的内容缩小到我在函数中查询中使用的一个视图,并且在视图内部是一个CAST!而且因为其中一个值是'NA',我的功能不确定地失败了:

SET NOCOUNT ON

DECLARE cursorX CURSOR FOR
SELECT t.name As [TABLE], c.name AS [COLUMN]--, system_type_id
FROM sys.tables t inner join sys.columns c on t.object_id = c.object_id 
WHERE t.name <> 'sysdiagrams'
  AND c.system_type_id NOT IN (42, 56, 108)
ORDER BY t.name, c.system_type_id

DECLARE @T sysname, @C sysname

OPEN cursorX

FETCH NEXT FROM cursorX INTO @T, @C

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @sql NVARCHAR(MAX)
    SET @sql = N'IF EXISTS(SELECT 1 FROM ' + @T + ' WHERE ' + @C + ' = ''NA'')
BEGIN
    PRINT ''Table=' + @T + ', Column=' + @C + '''
    SELECT * FROM ' + @T + ' WHERE ' + @C + ' = ''NA''
END'
    --PRINT (@sql)
    EXEC (@sql)

    FETCH NEXT FROM cursorX INTO @T, @C
END

CLOSE cursorX
DEALLOCATE cursor