sql - 如何在函数请求中插入来自子查询的文本
问题描述
我在主数据库(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'.
有人有线索吗?
解决方案
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 版本。)
推荐阅读
- r - Strucchange 声称没有中断日期,但仍然报告它们
- r - 计算 R 中阈值后的价格变化
- jfrog-xray - Xray -Artifactory 集成 [无法保存访问配置]
- java - 使用 Java 同时调用多个 Web 服务
- javascript - SyntaxError: Unexpected identifier 'TypeIt'. import call expects exactly one argument
- php - 如何 PHP 循环,找到子类别直到没有更多的孩子,然后移动到兄弟姐妹?
- javascript - Javascript - 在同一选项卡中打开 HTML 文件
- javascript - Chrome 扩展:如何将退格键事件发送到文本字段?
- cron - 使用工作队列的 Kubernetes 作业调度
- arrays - 如何防止我的阵列变得混乱?(AngularJs)