t-sql检查文件是否存在

pcrecxhr  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(283)

我正在尝试检查文件是否存在,并将结果存储在变量中。我在等变量 @file_exists 是真是假,但我得到了一个错误:
将nvarchar值“xp\u fileexist c:\myfile\u 20200521.xls”转换为数据类型int时,转换失败
我做错了什么?

DECLARE @filepath VARCHAR(MAX), 
        @file_exists INT = 0, 
        @sql VARCHAR(MAX);

SET @filepath = (SELECT CONCAT('C:\ABC\myfile_',convert(varchar,getdate(),112),'.xls'));

SET @sql = N'xp_fileexist '+@filepath+ N', '+@file_exists+ N' OUT' 
EXEC sp_executesql @sql

IF(@file_exists = 1)
    PRINT 'File exists'
6ju8rftf

6ju8rftf1#

您遇到了数据类型优先的情况。声明

SET @sql = N'xp_fileexist '+@filepath+ N', '+@file_exists+ N' OUT'

包含 @file_exists 被宣布为 INT ,因此所有字符串都需要转换为 INT 用于加法的值。
你想要的是:

declare @FilePath as NVarChar(256), @FileExists as Int = 0;

set @FilePath = Concat( N'C:\ABC\myfile_', Convert( NVarChar(8), GetDate(), 112), N'.xls' );

execute master.dbo.xp_fileexist @FilePath, @FileExists output;

if ( @FileExists = 1 )
    print 'File exists.'

请注意,在 Convert 有一个长度。

5q4ezhmt

5q4ezhmt2#

最简单的解决办法是 concat() 功能:

SET @sql = CONCAT(N'xp_fileexist ', @filepath, N', ', @file_exists, N' OUT')

那样的话, + 不会被解释为字符串。
您还可以将值作为参数传入,这将是推荐的。

相关问题