Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 调用Sqlcmd更改uniqueidentifier的情况_Sql Server_Powershell_Sqlcmd_Invoke Sqlcmd - Fatal编程技术网

Sql server 调用Sqlcmd更改uniqueidentifier的情况

Sql server 调用Sqlcmd更改uniqueidentifier的情况,sql-server,powershell,sqlcmd,invoke-sqlcmd,Sql Server,Powershell,Sqlcmd,Invoke Sqlcmd,我正在尝试开发一个脚本,以便按照RFC4180定期导出格式正确的CSV文件。我使用一个PowerShell脚本来实现这一点,它调用Sqlcmd。但是,输出似乎改变了数据库中某些值的大小写。例如,uniqueidentifier值从完全大写改为 92adbee2-adbf-de11-90b0-005056b325c4 下面是我运行以仅输出到powershell终端的脚本 Invoke-Sqlcmd -Query "SELECT top 10 * FROM dbo.Account;" ` -Dat

我正在尝试开发一个脚本,以便按照RFC4180定期导出格式正确的CSV文件。我使用一个PowerShell脚本来实现这一点,它调用Sqlcmd。但是,输出似乎改变了数据库中某些值的大小写。例如,uniqueidentifier值从完全大写改为

92adbee2-adbf-de11-90b0-005056b325c4

下面是我运行以仅输出到powershell终端的脚本

Invoke-Sqlcmd -Query "SELECT top 10 * FROM 
dbo.Account;" `
-Database db_name `
-Server server-name `
-QueryTimeout 65535
有没有办法阻止此工具更改uniqueidentifier类型的值的大小写

感谢Powershell中使用的: $SQL_Command=“sqlcmd-S$DbServer-U$SQL_User-P$SQL_Pass-i$TSQL_File-o$CSV_OutPut_FileName-S','-w 65530”

调用表达式$SQL\u命令

第一个变量($SQL_命令)存储sqlcmd命令 Invoke Expression cmdlet作为命令计算或运行指定字符串

$TSQL_File变量是包含sql语句的文件名(例如:从TableName中选择GUID….sql server中的uniqueidentifier数据类型,或者您可以使用SELECT*FROM TableName)

输出不会改变SQL Server中uniqueidentifier数据类型的情况…希望这有帮助

sqlcmd的语法
-数据包大小
-(专用管理员连接)
-b(出现错误时终止批处理作业)
-c批处理_终止符
-C(信任服务器证书)
-d数据库名称
-e(回声输入)
-E(使用可信连接)
-f代码页| i:codepage[,o:codepage]| o:codepage[,i:codepage] -g(启用列加密) -G(使用Azure Active Directory进行身份验证) -h行每行标题
-H工作站名称
-我输入了\u文件
-I(启用引用标识符)
-j(打印原始错误消息) -k[1|2](删除或替换控制字符)
-K应用程序\u意图
-l登录\u超时
-L[c](列出服务器,可选清洁输出)
-m错误\u级别
-M多子网故障切换
-N(加密连接)
-o输出_文件
-p[1](打印统计信息,可选冒号格式)
-P密码
-q“cmdline查询”
-Q“cmdline查询”(并退出)
-r[0|1](MSG至标准杆)
-R(使用客户端区域设置)
-s柱分离器
-S[协议:]服务器[实例名称][,端口]
-t查询\u超时
-u(unicode输出文件)
-U登录\U id
-v var=“value”
-V错误\严重性\级别
-w列的宽度
-W(删除尾随空格)
-x(禁用变量替换)
-X[1](禁用命令、启动脚本、环境变量、可选退出)
-y变量长度类型显示宽度
-Y固定长度\类型\显示\宽度
-z新密码
-Z新密码(和退出)
-? (用法)

在Powershell中使用: $SQL_Command=“sqlcmd-S$DbServer-U$SQL_User-P$SQL_Pass-i$TSQL_File-o$CSV_OutPut_FileName-S','-w 65530”

调用表达式$SQL\u命令

第一个变量($SQL_命令)存储sqlcmd命令 Invoke Expression cmdlet作为命令计算或运行指定字符串

$TSQL_File变量是包含sql语句的文件名(例如:从TableName中选择GUID….sql server中的uniqueidentifier数据类型,或者您可以使用SELECT*FROM TableName)

输出不会改变SQL Server中uniqueidentifier数据类型的情况…希望这有帮助

sqlcmd的语法
-数据包大小
-(专用管理员连接)
-b(出现错误时终止批处理作业)
-c批处理_终止符
-C(信任服务器证书)
-d数据库名称
-e(回声输入)
-E(使用可信连接)
-f代码页| i:codepage[,o:codepage]| o:codepage[,i:codepage] -g(启用列加密) -G(使用Azure Active Directory进行身份验证) -h行每行标题
-H工作站名称
-我输入了\u文件
-I(启用引用标识符)
-j(打印原始错误消息) -k[1|2](删除或替换控制字符)
-K应用程序\u意图
-l登录\u超时
-L[c](列出服务器,可选清洁输出)
-m错误\u级别
-M多子网故障切换
-N(加密连接)
-o输出_文件
-p[1](打印统计信息,可选冒号格式)
-P密码
-q“cmdline查询”
-Q“cmdline查询”(并退出)
-r[0|1](MSG至标准杆)
-R(使用客户端区域设置)
-s柱分离器
-S[协议:]服务器[实例名称][,端口]
-t查询\u超时
-u(unicode输出文件)
-U登录\U id
-v var=“value”
-V错误\严重性\级别
-w列的宽度
-W(删除尾随空格)
-x(禁用变量替换)
-X[1](禁用命令、启动脚本、环境变量、可选退出)
-y变量长度类型显示宽度
-Y固定长度\类型\显示\宽度
-z新密码
-Z新密码(和退出)

-? (用法)

一些评论指出,uniqueidentifier实际上是一个二进制值,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxx只是二进制值的多种不同视觉表示形式之一

在SQL Server Management Studio中,“查询结果”窗口使用带大写十六进制数字的xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx布局格式化唯一标识符

SQL Server中的uniqueidentifier类型映射到PowerShell(即.Net)中的Guid类型。默认的.Net方法也使用xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx布局,但使用小写十六进制数字

如果可以在PowerShell中重写Guid.ToString方法,则可以更改所使用的格式,但不能这样做。如果您已经有一个用于处理RFC 4180特殊情况(引号、值中的分隔符等)的自定义表格式化程序,那么您可以在其中添加Guid格式。

作为
#----------------------------------------------------------------------------------------------------------   
#--- Each line of TSQL_FileName.TXT ($ScriptsArray) contains a file name ($TSQL_File) of the TSQL statement that need to be execute
#----------------------------------------------------------------------------------------------------------   
FOREACH ($TSQL_File in $ScriptsArray)
{ $Num_TSQL_File++
  $Result_MSG = ''
  #----------------------------------------------------------------------------------------------------------   
  #--- GENERATE OUT PUT FILE NAME USE FOR CSV FILE WHEN WE RUN sqlcmd 
  #----------------------------------------------------------------------------------------------------------   
  $OutPut_File = (Get-Item $TSQL_File).Basename+'_'+$OutPut_DateTime
  $OutPut_File = $OutPut_File.replace(' ','_')
  $OutPut_File = $OutPut_File.replace('.','_')
  $OutPut_File = $OutPut_File+'.CSV'
  $OutPut_Error = ''
  $SQL_Command = "sqlcmd -S $DbServer -U $SQL_User -P $SQL_Pass -i $TSQL_File -o $OutPut_File -s ',' -w 65530"
  Invoke-Expression $SQL_Command 
  $OutPut_Array = Get-Content $OutPut_File
  $ThirdLine = "|"+$OutPut_Array[3]+"|"
  #----------------------------------------------------------------------------------------------------------
  #--- Determine if an error had occured, if so send email notification
  #----------------------------------------------------------------------------------------------------------
  IF (($OutPut_Array -like "Error*") -or ($OutPut_Array -like "Msg*") -or ($OutPut_Array -like "Invalid*")  -or ($OutPut_Array -like "Sqlcmd: Error*") )
  { $OutPut_Error = (Get-Item $TSQL_File).Basename+'_'+$OutPut_DateTime+'.ERR'
    $OutPut_Array | out-file ".\$OutPut_Error"
    $Result_MSG = 'Error!'
    $OutPut_File = $OutPut_Error
    $OutPut_FileSizeKb = $NumOfRow_Send = 0
    $global:DbErr++
    "{0,-16} {1,-40} {2,-60} {3,-10} {4,-4} {5,-4}" -f $DbServer, $TSQL_File, $OutPut_File, [int]$OutPut_FileSizeKb, $NumOfRow_Send, $Result_MSG
    $Results_Array += ,@($Results_Array_Index, $DbServer, $TSQL_File, $OutPut_File, $OutPut_FileSizeKb, $NumOfRow_Send, $Result_MSG)  
    $Results_Array_Index++
  }
  ELSE
  { #----------------------------------------------------------------------------------------------------------
    #--- Determine if zero row return from query, if so modify the array so that it will send only header info
    #----------------------------------------------------------------------------------------------------------
    IF ( ($OutPut_Array.Length -EQ 3) -and ($ThirdLine -EQ '||') )
    { $NeedFix_Array = Get-Content $OutPut_File
      #-------------------------------------------------------------
      #--- MODIFY THE ARRAY SO THAT IT WILL SEND ONLY THE HEADER
      #-------------------------------------------------------------
      $NeedFix_Array = $NeedFix_Array[1]
      #-----------------------------------------------------------
      #--- REMOVE BLANK SPACE FROM THE LINE
      #-----------------------------------------------------------
      $NeedFix_Array = $NeedFix_Array -replace '\s+', ' '
      $NeedFix_Array = $NeedFix_Array -replace ' ,', ','
      $NeedFix_Array = $NeedFix_Array -replace ', ', ','
      #-----------------------------------------------------------
      $NeedFix_Array | out-file $OutPut_File -Encoding ASCII
      $OutPut_FileSizeKb = (Get-Item $OutPut_File).length/1KB
      $OutPut_FileSizeKb = [int][Math]::Ceiling($OutPut_FileSizeKb)
      $NumOfRow_Send = 1
      $Num_CSV_File_Created++
      "{0,-16} {1,-40} {2,-60} {3,-10} {4,-4} {5,-4}" -f $DbServer, $TSQL_File, $OutPut_File, [int]$OutPut_FileSizeKb, $NumOfRow_Send, $Result_MSG
      $Results_Array += ,@($Results_Array_Index, $DbServer, $TSQL_File, $OutPut_File, $OutPut_FileSizeKb, $NumOfRow_Send, $Result_MSG)  
      $Results_Array_Index++
    }
    #----------------------------------------------------------------------------------------------------------
    #--- REMOVE 1st LINE AND '-----' IN 3rd LINE AND FIX THE SPACES BETWEEN COMMA
    #----------------------------------------------------------------------------------------------------------
    ELSE
    { $NeedFix_Array = Get-Content $OutPut_File
      #-------------------------------------------------------------
      #--- REMOVE THE FIRST LINE 
      #-------------------------------------------------------------
      $NeedFix_Array = $NeedFix_Array[1..($NeedFix_Array.Length-1)]
      #-------------------------------------------------------------
      #--- REMOVE THE SECOND LINE AFTER THE FIRST LINE WERE REMOVE
      #-------------------------------------------------------------
      $NeedFix_Array = $NeedFix_Array[0,0+2..($NeedFix_Array.length - 1)]
      $NeedFix_Array = $NeedFix_Array[1..($NeedFix_Array.Length-1)]
      #-----------------------------------------------------------
      #--- REMOVE BLANK SPACE FROM THE LINE
      #-----------------------------------------------------------
      $NeedFix_Array = $NeedFix_Array -replace '\s+', ' '
      $NeedFix_Array = $NeedFix_Array -replace ' ,', ','
      $NeedFix_Array = $NeedFix_Array -replace ', ', ','
      #-----------------------------------------------------------
      $NeedFix_Array | out-file $OutPut_File -Encoding ASCII
      $OutPut_FileSizeKb = (Get-Item $OutPut_File).length/1KB
      $OutPut_FileSizeKb = [int][Math]::Ceiling($OutPut_FileSizeKb)
      $NumOfRow_Send = $NeedFix_Array.Length
      $Num_CSV_File_Created++
      "{0,-16} {1,-40} {2,-60} {3,-10} {4,-4} {5,-4}" -f $DbServer, $TSQL_File, $OutPut_File, [int]$OutPut_FileSizeKb, $NumOfRow_Send, $Result_MSG
      $Results_Array += ,@($Results_Array_Index, $DbServer, $TSQL_File, $OutPut_File, $OutPut_FileSizeKb, $NumOfRow_Send, $Result_MSG)  
      $Results_Array_Index++
    }
  }
}`enter code here`