Excel与SQL Server通信以识别用户。

时间:2013-02-23 03:46:28

标签: sql-server excel

Excel查询SQL Server。尝试使用当前用户名进行查询。我有一个Excel文件,用于查询SQL Server中的视图。视图设置为根据查询视图的用户返回结果。

我在网络服务器上设置了一个文件,供其他人访问,希望当他们打开文件时,它只会显示与他们相关的信息。

但信息仍然仅指我自己。我希望它显示用户使用该文件的信息,就像他们直接查询视图一样。

以下是视图的示例查询:

Select * from dbo.WorkEstimate where Estimator = SUSER_NAME()

但Excel表格仅返回与我有关的信息。我认为它可能与始终指定我的工作站名称的connectstring有关。有没有办法改变它以反映使用该文件的个人(或他们的工作站)?

2 个答案:

答案 0 :(得分:3)

SQL statment中的SUSER_NAME()(transact-sql)是指当前正在执行的SQL语句的上下文中的当前用户。在您的情况下,它是您在连接字符串中指定的用户标识。 sql server使用connectionstring中指定的用户来运行该语句,因此SUSER_NAME()反映了该用户。

您需要使用以下Excel函数指定运行Excel的用户(Windows环境):

  • Application.Username是Excel工具中设置的用户名>选项(在用户名框下)
  • Environ("Username")是您为Windows注册的名称,请参阅控制面板>系统

因此,您的SQL语句必须是:

vsSQL = "SELECT * FROM dbo.WorkEstimate WHERE (Estimator = '" & Environ("Username") & "');"

希望这有帮助。

答案 1 :(得分:0)

您不需要让Excel与SQL Server通信就可以解决这个问题。 Excel需要与用户的机器通信。

使用此代码可以发现与登录到计算机的用户相关的所有环境变量。查看结果,找出您需要传递给查询的内容。

将模块添加到Excel文件并粘贴以下内容:

Sub ListAllEnvironmentVariables()
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = Sheets("Sheet1")
    Set rng = ws.Range("A1")

    Dim i As Integer
    i = 1
    Do Until Environ$(i) = ""
        rng.Offset(i - 1).Value = Environ(i)
        i = i + 1
    Loop
End Sub

我在我的示例中使用Sheet1,但您可以更改它并将ws设置为工作簿中的任何空白工作表,以查看其工作原理。如果工作表上有数据,显然不要使用Sheet1