重用相同的查询,但只更新嵌套变量的值

时间:2018-06-17 19:23:48

标签: sql sql-server database tsql database-design

在T-SQL中,如果我想重用相同的查询但只更新嵌套变量的值,我该如何实现?我在下面尝试了两个示例,但是,它们都返回 null 值而不是产生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;

1 个答案:

答案 0 :(得分:3)

一种方法是使用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