将多个数据类型传递到动态sql值中而不传递参数化查询

修道院

我在存储过程中有一个动态SQL查询,该查询可以工作并提供正确的结果。但这花了太长时间,因为我必须将其比较为varchar而不是int。我相信SQL Server中的@query变量要求该语句为unicode。这是动态SQL部分

ALTER PROCEDURE [dbo].[sp_GetRows]( @Id varchar(64))
AS
BEGIN
 DECLARE @Query nvarchar(4000),
 @Comp varchar(256)

SELECT @Comp
=  STUFF(( 
        SELECT DISTINCT ',' + char(39)+
        tci.Component +char(39)
        FROM  TCI tci WITH(NOLOCK) 
            JOIN CDetail cd WITH(NOLOCK) 
           ON  tci.ParentCId = cd.CIdentifier 
            WHERE tci.ParentCId  = @Id
            AND cd.ParentBranch IS NULL
            FOR XML PATH('')),1,1,'')
    SET @Query
    = 'WITH CTE AS 
        (       
            SELECT '+@Id+' as ParentCId, CIdentifier as ChildCId,
            a.Comp as Comp 
            from dbo.CD cd WITH(NOLOCK)             

               INNER JOIN  

            (SELECT DISTINCT ChildCId,Comp 
            FROM TCI tc WITH(NOLOCK) 
            WHERE ParentCId = '+ @Id + '

                                ) a 
            ON cd.CIdentifier= a.ChildCId
        );
       EXEC (@Query)
        END;

这是比较-SELECT CIdentifier from #tempTable temp WITH(NOLOCK)WHERE temp.CIdentifier <'+ @ Id +'...。

相比之下,这是CIdentifier = 1122233而不是CIdentifier ='1122233',因为动态SQL不允许我将其作为int传递。我不断收到“无法将varchar转换为int错误”

所以我使用了参数化查询-希望这可以让我传递int值。这是查询部分

        SET @Query
    = N';WITH CTE AS 
        (       
            ......
             (SELECT DISTINCT ChildCId,Comp 
                    FROM TCI tc WITH(NOLOCK) 
                    WHERE ParentCId = @Id
                    AND ChildCId + tc.Comp
                        NOT IN
            (SELECT ChildId + Comp FROM dbo.TCI WITH(NOLOCK) 
        WHERE ParentId IN   (SELECT CIdentifier FROM  #tempTable WITH(NOLOCK) 
                            WHERE  temp.CIdentifier < @Idn
                            AND Comp IN ( @Comp))                   
                            )
                            ) 
            )a 
         ON cd.CIdentifier= a.ChildId
        )
        SELECT * FROM CTE;'


EXEC sp_executeSQL @Query,'@Id VARCHAR(64),@Idn INT,@comp VARCHAR(256)',@Id=@Id,@Idn=@Idn,@comp =@comp 

这给了我错误的结果,并且当我看到使用跟踪的执行时-看到没有将值传递到查询中。如何获取查询以获取变量?

希门

只需在第一个查询中更改WHERE ParentCId = '+ @Id + '为即可WHERE ParentCId = '+ cast(@Id as varchar(16)) + '问题是+,当值是numeric类型或时dateSQL Server将其视为加法,否则将其串联。这是您得到错误的地方。但是,执行此操作时,它不会使SQL Server将其与字符串文字进行比较,因此您不必担心。如果PRINT (@Query)在最后使用而不是EXEC (@Query)

请注意,需要在您具有任何NUMERIC数据类型的其他位置进行更改,例如在SELECT部分中,SELECT '+ cast(@Id as varchar(16)) +'

另外,您的代码不会显示@Id值的来源,因此请谨慎使用SQL注入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将数据库查询返回的数据存储到动态创建的通用Go数据类型中

在方法重载中传递不同数据类型的值

将数组从VBA传递到C#时,数据类型不匹配在哪里?

如何在函数内部传递参数并将其转换为某个数据类型?

将参数传递给Azure数据工厂中的SQL查询

将动态类型传递到管道容器中

在构造中传递数据类型

将多个数据类型传递给Type变量

将参数传递给参数化查询?

如何将多个HttpClient参数传递/注入到类型化的HttpClientClass中?

使用多个参数将数据从javascript传递到MVC Controller

python:如何将参数传递到SQL查询

将数据类型作为参数传递给函数

是否可以将值从PYODBC传递到表类型参数到SQL Server?

VBA中SQL查询上的数据类型不匹配

将多个数据参数从$ .ajax传递到webmethod

将多个值打包为单个数据类型

jQuery:将UTM参数动态传递到页面中的链接

sql查询不传递参数

如何将多个数据从片段传递到活动

如何使用JQuery将值从动态创建的表传递到新的数据库查询中?

将动态列名称传递到SQL Server时数据类型错误

如何将参数从 LINQ 查询传递到 SQL 视图?

如何将“序列值”插入到数字数据类型中?- SQL

传递具有不同数据类型的多个参数:Flutter

将多个用户输入从 python 传递到 SQL 查询

如何在 SQL 中循环用户定义的数据类型并将参数传递给程序

将 vuejs 输入值传递给多个数据

无法将多个数据参数从 jquery ajax 传递到剃须刀 OnPost