小编Vla*_*nov的帖子

如何强制 MERGE 语句与 DELETE 使用索引查找?

我为我的 Facebook 应用程序制作了 MS SQL 2014 数据库,该应用程序与朋友一起使用。我在 DB 中为所有用户保留好友,并在应用程序启动时从 Facebook 更新他们。为此,我使用了 MERGE 语句(表变量 @FriendUserIds 包含好友 ID 列表;表 UserFriends 具有聚集主键(UserId、FriendUserId)):

MERGE UserFriends
    USING (
        SELECT
                UserId
            FROM @FriendUserIds
    ) AS source (FriendUserId)
        ON UserFriends.UserId = @UserId
            AND UserFriends.FriendUserId = source.FriendUserId
    WHEN NOT MATCHED BY TARGET
        THEN INSERT (UserId, FriendUserId)
            VALUES (@UserId, source.FriendUserId)
    WHEN NOT MATCHED BY SOURCE
        AND UserFriends.UserId = @UserId
        THEN DELETE;
Run Code Online (Sandbox Code Playgroud)

问题是查询优化器无法识别它可以在 UserFriends 上使用 INDEX SEEK。它使用 SCAN 代替,我不知道强制 SEEK 的方法。现在,我通过将操作拆分为两个查询(用于添加新朋友的 MERGE 和用于删除不再朋友的 DELETE)来规避该问题,这仍然比单个 MERGE 语句快得多(没有 DELETE 语句的 MERGE 使用 …

sql sql-server indexing merge seek

2
推荐指数
1
解决办法
2299
查看次数

SQLSRV查询将输出参数作为奇怪文本返回

我在SQL Server 2012中有一个存储过程,它首先检查数据是否存在,如果存在,则将Output参数设置@Return为1并运行select查询,如果不存在,则设置@Return为0并返回不同的select查询.

在测试此存储过程以确保数据准确时,它是完美的并返回我期望的数据.问题在于PHP端在尝试读取它显示的输出参数??t_rrr时应该显示1或0.我相信问题可能在sqlsrv_query中的预定义常量中,但我似乎无法使其工作.这是我的代码:

PHP:

if(isset($_GET['accno'])) {

$search = $_GET['accno'];

$return = "";

$tsql_callSP = "EXEC Intranet.CustomerSearch @Search=?, @Return=?";
$params = array( 
    array($search, SQLSRV_PARAM_IN),
    array($return, SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR),SQLSRV_SQLTYPE_INT),
    );

/* Execute the query. */
$stmt = sqlsrv_query( $conn, $tsql_callSP, $params);
if( $stmt === false )
{
    echo "EXEC Intranet.CustomerSearch Failed\n";
    die( print_r( sqlsrv_errors(), true));
}

while($res = sqlsrv_next_result($stmt))
{
    // make sure all result sets are stepped through, 
    // since the output params may not …
Run Code Online (Sandbox Code Playgroud)

php sql sql-server stored-procedures sqlsrv

1
推荐指数
1
解决办法
4491
查看次数

如何编写线程安全的SQL Server存储过程

我有一些存储过程,其中正在执行多个查询.为了获得插入的最后一个身份我正在使用IDENT_CURRENT哪个是因果问题.

我的问题是我可以在T-SQL中使用像C#这样的锁定语句,以便它可以是线程安全的吗?

编辑:我正在使用的代码

INSERT INTO activities
    (creator
    ,title
    ,description)
VALUES
    (@Creator
    ,@Tile
    ,@Description)

SET @ActivityId = IDENT_CURRENT('dbo.activities');

INSERT INTO [dbo].activity_cfs
    ([activity_id],
    [cf_id],
    [cf_field_name],
    [field_key],
    [value])
SELECT 
    @ActivityId,
    cf_id,
    cf_field_name,
    field_key,
    value
FROM @ActivityCustomFields 
Run Code Online (Sandbox Code Playgroud)

@ActivityCustomFields 是我的临时表.

c# sql-server

1
推荐指数
1
解决办法
997
查看次数

如何从一个SELECT语句插入多个表

我试图从一个select语句插入多个表.可能吗?

这是我在这里要做的:

insert into table1 (Name, Address)
insert into table2 (Name, Address)
select Name, Address from MainTable
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2008

1
推荐指数
1
解决办法
8193
查看次数

如果SQL变量为null,则选择包括null的所有数据

我必须在SQL Server 2012中运行查询以从表中选择数据.有一个变量@status.如果此变量为null,则必须返回所有数据(如果为value)

我有一个示例查询

SELECT * 
FROM StatusTable 
WHERE (Status = IIF(@status IS NULL, status, @status))
Run Code Online (Sandbox Code Playgroud)

当此查询@status不为null时,此查询正常工作,但是当它为null时,它仅返回status列不为null的行.

样品表:

| id | status | Data |
|----|--------|------|
| 1  | null   | a    |
| 2  | ok     | b    |
| 3  | fail   | c    |
| 4  | fail   | d    |
| 5  | null   | e    |
Run Code Online (Sandbox Code Playgroud)

什么时候@status"失败":

| id | status | Data |
|----|--------|------|
| 3  | fail …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2012

1
推荐指数
1
解决办法
546
查看次数

如何从组中按日期选择第一行

我有一个像这样的表:

City       date      Person 
A        2018/05/01   peter
A        2018/03/01   Jack
B        2018/02/16    TOM
C        2018/03/01   Mike
Run Code Online (Sandbox Code Playgroud)

现在我想找到每个城市最早的人。结果将是

A        2018/03/01   Jack
B        2018/02/16    TOM
C        2018/03/01   Mike
Run Code Online (Sandbox Code Playgroud)

怎么做?

sql sql-server

1
推荐指数
1
解决办法
9414
查看次数