Sql server SQL Server 2008 R2-传递的长度参数无效

Sql server SQL Server 2008 R2-传递的长度参数无效,sql-server,Sql Server,情况: 我有一个数据库,里面有一堆图像,我正在将它们导出到文件夹中。有一个图像列和一个源图像列。在“源图像”列中,大多数记录如下所示: Column 1 Column 2 C:\blah\blah\test.pdf BlobField 导出文件时,我想将其命名为test.pdf,我可以通过以下方式实现: RIGHT(SOURCE_DOCUMENT, (CHARINDEX('\',REVERSE(SOURCE_DOCUMENT),0))-1) 这

情况:

我有一个数据库,里面有一堆图像,我正在将它们导出到文件夹中。有一个图像列和一个源图像列。在“源图像”列中,大多数记录如下所示:

Column 1                   Column 2
C:\blah\blah\test.pdf      BlobField
导出文件时,我想将其命名为test.pdf,我可以通过以下方式实现:

 RIGHT(SOURCE_DOCUMENT, (CHARINDEX('\',REVERSE(SOURCE_DOCUMENT),0))-1)
这很有效

但在一些记录中,它们看起来就像

Column 1
Message.txt
我得到一个无效的长度参数passed错误,因为我猜它没有\


有人知道如何解决这个问题吗?

如果列有
\
字符,您可以使用大小写表达式获取一个值(您的
右(…)
函数),如果列没有
\
字符,则可以使用另一个值(可能是整个字符串)。

您可以使用大小写表达式获取一个值(您的
右(…)
函数)如果列有
\
字符,如果没有,则返回不同的值(可能是整个字符串)。

检查文档名称中是否有
\
,如果仅为文件名,则返回未修改的值:

IIF(CHARINDEX('\', SOURCE_DOCUMENT) > 0, RIGHT(SOURCE_DOCUMENT, (CHARINDEX('\',REVERSE(SOURCE_DOCUMENT),0))-1), SOURCE_DOCUMENT)

检查文档名称中是否有
\
,如果仅为文件名,则返回未修改的文档:

IIF(CHARINDEX('\', SOURCE_DOCUMENT) > 0, RIGHT(SOURCE_DOCUMENT, (CHARINDEX('\',REVERSE(SOURCE_DOCUMENT),0))-1), SOURCE_DOCUMENT)

只需将
\
附加到
源文档的末尾,以防止出错:

SELECT RIGHT(SOURCE_DOCUMENT, (CHARINDEX('\',REVERSE(SOURCE_DOCUMENT) +'\', 0))-1)

只需将
\
附加到
源文档的末尾,以防止出错:

SELECT RIGHT(SOURCE_DOCUMENT, (CHARINDEX('\',REVERSE(SOURCE_DOCUMENT) +'\', 0))-1)

您可以使用
CASE
语句来实现这一点:

SELECT  CASE
          WHEN CHARINDEX('\', SOURCE_DOCUMENT) > 0 THEN RIGHT(SOURCE_DOCUMENT, (CHARINDEX('\',REVERSE(SOURCE_DOCUMENT),0))-1)
          ELSE SOURCE_DOCUMENT
        END AS SOURCE_DOCUMENT

这将使用列包含反斜杠的
RIGHT(…)
语句,或仅返回不包含反斜杠的列。

您可以使用
CASE
语句来实现这一点:

SELECT  CASE
          WHEN CHARINDEX('\', SOURCE_DOCUMENT) > 0 THEN RIGHT(SOURCE_DOCUMENT, (CHARINDEX('\',REVERSE(SOURCE_DOCUMENT),0))-1)
          ELSE SOURCE_DOCUMENT
        END AS SOURCE_DOCUMENT
这将在列包含反斜杠的地方使用
RIGHT(…)
语句,或者只返回不包含反斜杠的列