首页 > 解决方案 > 如何在函数请求中插入来自子查询的文本

问题描述

我在主数据库(xp_fileexist)上使用一个函数来检查一个文件夹是否为空。如果它是空的,我想要一个 0,否则为 1。

如果我硬编码文件夹名称('C:\Import\2016-01-01\Transaction')它工作正常。对我不起作用的是将日期作为变量,因为日期会不时更改。对于变量,我使用这个:

'C:\Import\The Netherlands\'+CAST((从系统中选择工作日期..tmpworkingdate) AS VARCHAR(10))+'\Transaction(BP)'

这是我尝试过的代码:

CREATE TABLE #temp (FileExists int, IsDirectory int, ParentDirExists int)

INSERT INTO #temp

EXEC master..xp_fileexist ('C:\Import\'+CAST((select workingdate from system..tmpworkingdate) AS VARCHAR(10))+'\Transaction(BP)')

IF EXISTS(SELECT IsDirectory FROM #temp WHERE IsDirectory=1)

PRINT 1

ELSE

PRINT 0

DROP TABLE #temp

Error: Msg 102, Level 15, State 1, Line 5 Incorrect syntax near
'C:\Import\The Netherlands\'. Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'AS'.

有人有线索吗?

标签: sqlsql-serverfunction

解决方案


EXEC不允许字符串操作(或任何表达式评估)。预先定义值:

DECLARE @filename VARCHAR(MAX);
SET @filename = 'C:\Import\'+CAST((select workingdate from system..tmpworkingdate) AS VARCHAR(10))+'\Transaction(BP)';

EXEC master..xp_fileexist (@filename);

也就是说,您应该使用CONVERT()FORMAT()确保获得您真正想要的格式。您不希望系统更改完全破坏此代码。

编辑:

阿格!我没有意识到这EXEC master..xp_fileexist甚至不允许执行行上的字符串变量。因此,您必须将整个事情作为动态 SQL 来完成:

DECLARE @sql NVARCHAR(MAX) = 'EXEC master..xp_fileexist ''' + @filename + '''';

EXEC(@sql);

(网上有一些使用变量的例子,所以这可能取决于 SQL Server 版本。)


推荐阅读