Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将SQL select语句添加到参数_Sql Server_Tsql - Fatal编程技术网

Sql server 将SQL select语句添加到参数

Sql server 将SQL select语句添加到参数,sql-server,tsql,Sql Server,Tsql,我正在尝试构建一个参数,它包含一个逗号分隔的列表列,以便以后可以动态地使用它。但是,我在将select查询写入可用于单独select的参数时遇到了一个问题 这是我的参数,用于定义逗号分隔列表 DECLARE @sqlSrcCols VARCHAR(MAX) SET @sqlSrcCols = ' SELECT STUFF((SELECT '','' + a.sourceName FROM #matchedFields a FOR XML PATH('''')), 1,

我正在尝试构建一个参数,它包含一个逗号分隔的列表列,以便以后可以动态地使用它。但是,我在将select查询写入可用于单独select的参数时遇到了一个问题

这是我的参数,用于定义逗号分隔列表

DECLARE @sqlSrcCols VARCHAR(MAX)
SET @sqlSrcCols = '
SELECT STUFF((SELECT  '','' + a.sourceName
        FROM #matchedFields a
    FOR XML PATH('''')), 1, 1, '''') AS listStr'
这将输出一个逗号分隔的列表,如下所示

abc、cde、dfg、您的

然后,我想在如下查询中引用该列表:

DECLARE @sqlSelect VARCHAR(MAX) = 'SELECT ' + @sqlSrcCols + 'FROM a.TableName WHERE ExpDat = ''2020-01-01'' '
EXEC(@sqlSelect)
虽然我不能在查询中使用@sqlSrcCols,也不能使用EXEC@sqlSrcCols.


欢迎任何帮助。

我猜,但我认为你真正想做的是:

DECLARE @sqlSrcCols nvarchar(MAX); --Fixed datatype
SET @sqlSrcCols = STUFF((SELECT N',' + QUOTENAME(mF.sourceName) --Quoting is important
                         FROM #matchedFields mF --"a" for matchedFields?
                         FOR XML PATH(N''), TYPE).value('.', 'nvarchar(MAX)'),1,1,''); --used TYPE, in case of any odd characters


DECLARE @sqlSelect nvarchar(MAX);
SET @sqlSelect = N'SELECT ' + @sqlSrcCols + N' FROM a.TableName WHERE ExpDat = ''20200101'';'; --ISO dates are better, they won't fail depending on language/data type
--PRINT @SQL; --You debugging friend
EXEC sp_executesql @SQL; --Don't use EXEC(@SQL), use sp_executesql so you can parametrise when needed.
您没有将@sqlSrcCols的值设置为列的名称,而是将其设置为SQL语句。然后,当您连接这两个变量时,您会得到一个如下所示的语句:

SELECT 
SELECT STUFF((SELECT  ',' + a.sourceName
        FROM #matchedFields a
    FOR XML PATH('')), 1, 1, '') AS listStrFROM a.TableName WHERE ExpDat = '2020-01-01'
正如你所见,这毫无意义

奖励:我会像你在下面看到的那样写上面的内容。原因是,动态SQL中也有格式设置;使调试更容易。我还对@ExpDat进行了参数化,以防需要,这表明您必须对动态语句进行参数化:


如果您感兴趣,可以在我的文章中找到一些关于动态SQL的指针,可以做什么,也可以不做什么。

猜测一下,但我认为您真正想做的是:

DECLARE @sqlSrcCols nvarchar(MAX); --Fixed datatype
SET @sqlSrcCols = STUFF((SELECT N',' + QUOTENAME(mF.sourceName) --Quoting is important
                         FROM #matchedFields mF --"a" for matchedFields?
                         FOR XML PATH(N''), TYPE).value('.', 'nvarchar(MAX)'),1,1,''); --used TYPE, in case of any odd characters


DECLARE @sqlSelect nvarchar(MAX);
SET @sqlSelect = N'SELECT ' + @sqlSrcCols + N' FROM a.TableName WHERE ExpDat = ''20200101'';'; --ISO dates are better, they won't fail depending on language/data type
--PRINT @SQL; --You debugging friend
EXEC sp_executesql @SQL; --Don't use EXEC(@SQL), use sp_executesql so you can parametrise when needed.
您没有将@sqlSrcCols的值设置为列的名称,而是将其设置为SQL语句。然后,当您连接这两个变量时,您会得到一个如下所示的语句:

SELECT 
SELECT STUFF((SELECT  ',' + a.sourceName
        FROM #matchedFields a
    FOR XML PATH('')), 1, 1, '') AS listStrFROM a.TableName WHERE ExpDat = '2020-01-01'
正如你所见,这毫无意义

奖励:我会像你在下面看到的那样写上面的内容。原因是,动态SQL中也有格式设置;使调试更容易。我还对@ExpDat进行了参数化,以防需要,这表明您必须对动态语句进行参数化:


如果您感兴趣,可以在我关于的文章中找到一些关于动态SQL的指针,包括做什么和不做什么。

尽管可能需要引用列名,但您的代码看起来不错。你的错误是什么@sqlSrcCols+'来自…-最后一列和FROM之间可能缺少空格。@sqlSrcCols变量中可能有空格,请选择该变量并进行验证。尽管可能需要引用列名,但您的代码看起来不错。你的错误是什么@sqlSrcCols+'来自…-最后一列和FROM之间可能缺少空格。@sqlSrcCols变量中可能有空格,请选择该变量并进行验证。Larnu,感谢您的详细回复,这非常有用,我已经看过您的文章,更有意义。我刚刚试着运行你提供的代码,但我得到了一个错误;必须声明标量变量@ExpDat。另外,我假设它应该是EXEC sys.sp_executesql@sqlSelectFixed,@dawsonz。我不能测试上面的内容,我没有你的表格,所以那里有一个印刷错误。Larnu,谢谢你的详细回复,这非常有用,我看过你的文章,更有意义。我刚刚试着运行你提供的代码,但我得到了一个错误;必须声明标量变量@ExpDat。另外,我假设它应该是EXEC sys.sp_executesql@sqlSelectFixed,@dawsonz。我不能测试上面的内容,我没有你的表格,所以有一个印刷错误。