SQL/VBA插入问题

SQL/VBA插入问题,sql,sql-server,vba,excel,Sql,Sql Server,Vba,Excel,我正在尝试创建一个用户列表,具体取决于谁使用我的excel电子表格 其想法是,当用户打开工作簿时,“打开”脚本将下载用户列表,检查该用户是否存在,如果不存在,则将其添加到其中 现在,我可以使用存储过程下载用户详细信息,但只要我在其中添加一行以检查用户是否存在,如果不添加用户,VBA就会抛出一个错误,声明“对象关闭时不允许操作” VBA代码: Sub UserDL() Dim us As Worksheet Dim USArr(0 To 11) As Variant Dim sKey As Str

我正在尝试创建一个用户列表,具体取决于谁使用我的excel电子表格

其想法是,当用户打开工作簿时,“打开”脚本将下载用户列表,检查该用户是否存在,如果不存在,则将其添加到其中

现在,我可以使用存储过程下载用户详细信息,但只要我在其中添加一行以检查用户是否存在,如果不添加用户,VBA就会抛出一个错误,声明“对象关闭时不允许操作”

VBA代码:

Sub UserDL()
Dim us As Worksheet
Dim USArr(0 To 11) As Variant
Dim sKey As String

Application.ScreenUpdating = False

With UserList
    .RemoveAll
    .CompareMode = vbTextCompare
End With

ThisUser = Environ("userdomain") & "\" & Environ("username")

Call ConnecttoDB

Set Cmd = New ADODB.Command: Set rs = New ADODB.Recordset

With Cmd
    .CommandTimeout = 30
    .ActiveConnection = cn
    .CommandText = "CSLL.DLUsers"
    .CommandType = adCmdStoredProc
    .Parameters("@Alias").Value = Environ("userdomain") & "\" & Environ("username")

    Set rs = .Execute
End With

With rs     
    If Not .BOF And Not .EOF Then
        .MoveLast
        .MoveFirst
        While (Not .EOF)
            On Error Resume Next
            If (IsNull(rs("FirstName")) Or IsNull(rs("LastName"))) = True Then
                Call AliasDet(rs("Alias"))
            End If
            On Error GoTo 0
            For i = 1 To 11
                USArr(i - 1) = rs(i)
            Next i
                With UserList
                    sKey = rs("Alias")
                    If Not .Exists(sKey) Then
                        .Add sKey, USArr
                    End If
                End With
            .MoveNext
        Wend
    End If
End With

Set Cmd = Nothing: Set rs = Nothing
End Sub
SQL存储过程:

    @Alias as varchar(max)
AS

IF NOT EXISTS(SELECT 1 FROM [CSLL].[Users] WHERE [Alias] = @Alias) INSERT INTO [CSLL].[Users] ([Alias], [Country], [Role]) VALUES (@Alias, 'UK', 'Employee')

SELECT * FROM [CSLL].[Users]

有人能帮助解释为什么当用户不存在时它会抛出错误(如果用户确实存在,那么它运行正常,因此我认为这与SQL存储过程有关,但看不到位置)

这可能是由于
INSERT
语句试图从存储过程返回值造成的。尝试将
设置为不计数位于存储过程顶部,以防止返回受影响的记录计数:

[SP Header and Parameters]
AS
SET NOCOUNT ON; -- Prevent insert from returning a result.

IF NOT EXISTS(SELECT 1 FROM [CSLL].[Users] WHERE [Alias] = @Alias)
BEGIN
    INSERT INTO [CSLL].[Users] ([Alias], [Country], [Role]) VALUES (@Alias, 'UK', 'Employee');
END

SELECT * FROM [CSLL].[Users]

sql中没有任何东西看起来不合适。当然,我看不到表,所以我不知道这些列是否存在。你真的需要varchar(最大值)吗?我建议不要使用sql保留字来命名对象和列名。我会启动探查器,看看你的进程是否在用户不存在的情况下执行。我已经进行了双重检查和三次检查-所有列都存在(在SQL相当新,没有意识到Alias是一个保留字)。此表可以与其他存储过程一起使用,IF语句和select语句本身也可以使用。只有当它们组合在一起,并且if语句为真时,它才会失败。同样,在MSSMS中以查询的形式运行它也能很好地工作,并返回完整的表(如预期的那样),如果用户不存在,它似乎不想在vba中填充记录集。如果用户确实存在,则会填充记录集:S