在t-sql中,如果我想重用同一个查询,但只更新嵌套变量的值,我如何才能实现这一点?不过,我已经尝试了下面的两个示例,它们都返回一个空值,而不是产生一个id。
我目前正在编写一个脚本来填充一个大大缩小的数据库,它包含原始数据库中所有的相同表,并且完全由模拟数据组成,用于测试。话虽如此,我需要从各种类型的表中获取id,以及从其他需要相互链接的表中获取各种其他数据。为了做到这一点,如果我可以通过向嵌套变量传递新值来重用相同的查询,那将是非常好的。
理想情况下,我想编写一个函数,在这里我可以调用该函数,只需为参数传递不同的值。我能做这个吗?
注意:我正在使用Microsoft SQL Server
第一:

DECLARE @var1 varchar(20);
DECLARE @queryTable int = (SELECT ID FROM dbo.Table WHERE [Name]=@var1);

SET @var1 = 'CellPhone';
SELECT @queryTable;

SET @var1 = 'HomePhone';
SELECT @queryTable;

第二:
DECLARE @var1 varchar(20);
DECLARE @queryTable int = (SELECT ID FROM dbo.Table WHERE [Name]=@var1);

SET @var1 = 'CellPhone';
DECLARE @queryTable_CellPhone INT = (SELECT (@queryTable));

SET @var1 = 'HomePhone';
DECLARE @queryTable_HomePhone INT = (SELECT (@queryTable));

SELECT @queryTable_CellPhone;
SELECT @queryTable_HomePhone;

最佳答案

一种方法是使用sp_executesql和输出变量:

DECLARE @sql NVARCHAR(MAX)=
   N'SELECT @query_table = ID FROM dbo.Table WHERE [Name]=@var1';
DECLARE @query_table INT, @va1 VARCHAR(100);

SET @var1 = 'CellPhone';
EXEC sp_executesql @sql,N'@query_table INT OUTPUT, @var1 VARCHAR(100)',
     @query_table OUT, @var1;
SELECT @query_table;

SET @var1 = 'HomePhone';
EXEC sp_executesql @sql,N'@query_table INT OUTPUT, @var1 VARCHAR(100)',
     @query_table OUT, @var1;
SELECT @query_table;

DBFiddle Demo
在没有截获结果的情况下:
DECLARE @sql NVARCHAR(MAX)= N'SELECT ID FROM dbo.Tab WHERE [Name]=@var1';
DECLARE @var1 VARCHAR(100);

SET @var1 = 'CellPhone';
EXEC sp_executesql @sql, N'@var1 VARCHAR(100)', @var1;

SET @var1 = 'HomePhone';
EXEC sp_executesql @sql, N'@var1 VARCHAR(100)', @var1;

DBFiddle Demo2

10-04 21:16
查看更多