如何调用带参数的 TSQL 语句?

How to invoke TSQL statement with params?

如何在 tsql 中使用参数或者在合并语句中重新使用这些值而不必多次传递这些值?我做错了什么?

运行 带有参数的 TSQL 在下面抛出异常

The variable name '@p1' has already been declared. Variable names must be unique within a query batch or stored procedure."

以 table def 为例:

dbo.Test
(
[key]      VarChar(50),
[value]    VarChar(50)
)

示例 Java 代码:

try (PreparedStatement s = conn.prepareStatement("DECLARE @p1 VarChar(50) DECLARE @p2 VarChar(50) SET @p1 = ? SET @p2 = ? INSERT dbo.Test ([key], [value]) values(@p1, @p2)"))
{
    s.setString(1,"Hello");
    s.setString(2,"World");
    s.execute();
}

下面也试了同样的结果

DECLARE @p1 VarChar(50) = ?
DECLARE @p2 VarChar(50) = ?

编辑: 上面的代码只是一个示例,我 need/want 使用 param 所以我不必多次设置相同的值以用于 Merge Statement

dbo.Test 的合并语句如下所示:

DECLARE @key    VarChar(50)
DECLARE @val    VarChar(50)

MERGE dbo.Test t
USING (SELECT @key [k]) s
    ON t.[key] = s.k
WHEN MATCHED THEN
    UPDATE
    SET t.[value] = @val
WHEN NOT MATCHED THEN
    INSERT ([key], [value])
    VALUES (@key, @val);

我不想一次又一次地设置相同的值

不要使用 TSQL 变量,直接插入值即可。

String sql = "INSERT INTO dbo.Test ([key], [value]) VALUES (?, ?)";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
    stmt.setString(1, "Hello");
    stmt.setString(2, "World");
    stmt.executeUpdate();
}

UPDATE 使用 MERGE:

编辑问题

The code above is just a sample, I need/want to use param so I don't have to set the same values multiple times for use in a Merge Statement

如果您按照 link 中所示的示例进行操作,您会发现每个变量仅使用一次,因此从 Java 执行时根本不需要变量.

Example A 来自 link:

MERGE Production.UnitMeasure AS target  
USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)  
ON (target.UnitMeasureCode = source.UnitMeasureCode)  
WHEN MATCHED THEN
    UPDATE SET Name = source.Name  
WHEN NOT MATCHED THEN  
    INSERT (UnitMeasureCode, Name)  
    VALUES (source.UnitMeasureCode, source.Name)  
OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;  

应用于问题的陈述:

String sql = "MERGE dbo.Test AS t" +
            " USING (SELECT ?, ?) AS s (k, v)" +
               " ON t.[key] = s.k" +
             " WHEN MATCHED THEN" +
                 " UPDATE SET [value] = s.v" +
             " WHEN NOT MATCHED THEN" +
                 " INSERT ([key], [value])" +
                 " VALUES (s.k, s.v)";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
    stmt.setString(1, "Hello"); // s.k
    stmt.setString(2, "World"); // s.v
    stmt.executeUpdate();
}