Sql server 如何将int参数传递给openquerysql

Sql server 如何将int参数传递给openquerysql,sql-server,Sql Server,我有这个查询,但是它给了我一个将varchar转换为int的异常。是否可以使用int而不是将其声明为varcharmax DECLARE @Filtro int, @SQL NVARCHAR(MAX); SET @Filtro = 1; SET @SQL ='SELECT * FROM OpenQuery(MACPAC, ''SELECT FET001.ET0109, count(FET001.ET0101) FROM AUTO.D805DATPOR.FET001 FET001 WHERE (

我有这个查询,但是它给了我一个将varchar转换为int的异常。是否可以使用int而不是将其声明为varcharmax

DECLARE @Filtro int, @SQL NVARCHAR(MAX);
SET @Filtro = 1;
SET @SQL ='SELECT *
FROM OpenQuery(MACPAC, ''SELECT FET001.ET0109,  count(FET001.ET0101)
FROM AUTO.D805DATPOR.FET001 FET001
WHERE (FET001.ET0104=''''POE'''') AND (FET001.ET0105=''''DIS'''')
GROUP BY FET001.ET0109
HAVING COUNT (FET001.ET0101) > ''''' + @Filtro + ''''''')';
EXEC sp_executesql @SQL;

您正在将字符串文字与INT串联,因此会出现错误。首先将INT转换为NVARCHAR。可以将变量保留为INT


您正在将字符串文字与INT串联,因此会出现错误。首先将INT转换为NVARCHAR。可以将变量保留为INT


无论您想在动态查询中的何处使用@Filtro变量,都应将其强制转换为nvarchar,如下所示:CAST@Filtro作为nvarcharN

在动态查询中使用@Filtro变量的任何位置,您应该像这样将其投射到nvarchar:CAST@Filtro作为nvarcharN,只需在追加之前将INT值强制转换为Varchar

DECLARE @Filtro int, @SQL NVARCHAR(MAX);
SET @Filtro = 1;
SET @SQL ='SELECT *
FROM OpenQuery(MACPAC, ''SELECT FET001.ET0109,  count(FET001.ET0101)
FROM AUTO.D805DATPOR.FET001 FET001
WHERE (FET001.ET0104=''''POE'''') AND (FET001.ET0105=''''DIS'''')
GROUP BY FET001.ET0109
HAVING COUNT (FET001.ET0101) > ''''' + RTRIM(LTRIM(CAST(@Filtro AS VARCHAR(20)))) + ''''''')';
EXEC sp_executesql @SQL;

只需在追加之前将INT值强制转换为Varchar

DECLARE @Filtro int, @SQL NVARCHAR(MAX);
SET @Filtro = 1;
SET @SQL ='SELECT *
FROM OpenQuery(MACPAC, ''SELECT FET001.ET0109,  count(FET001.ET0101)
FROM AUTO.D805DATPOR.FET001 FET001
WHERE (FET001.ET0104=''''POE'''') AND (FET001.ET0105=''''DIS'''')
GROUP BY FET001.ET0109
HAVING COUNT (FET001.ET0101) > ''''' + RTRIM(LTRIM(CAST(@Filtro AS VARCHAR(20)))) + ''''''')';
EXEC sp_executesql @SQL;

CONCAT隐式地处理转换,在这种情况下非常方便。@Jeroenmoster只有在使用SQL Server 2012或更高版本时才是真的是,我使用的是SSMS 2016您可以使用convertvarchar10将INT变量@Filtro转换为字符格式,@动态SQL生成集语句中的Filtro Concat隐式处理转换,在这种情况下非常方便。@JeroEnmoster仅在使用SQL Server 2012或更高版本时为true是的,我使用的是SSMS 2016您可以使用convertvarchar10将INT变量@Filtro转换为字符格式,@动态SQL生成集语句中的Filtro不认为它那么简单!尽管有很多答案。谢谢大家!没想到这么简单!尽管有很多答案。谢谢大家!